我是C#盲,如何添加数据库添加数据?

程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之使用C#语言建立本地数据库(二十三)
Unity3D研究院之使用C#语言建立本地数据库(二十三)
围观25331次
编辑日期: 字体:
原文:/threads/28500-SQLite-Class-Easier-Database-Stuff
原始文章主要是使用JavaScript语言建立本地数据库
以前在开发中一直使用IOS源生的数据库,通过传递消息的形式在与Unity3D中进行交互。本文我在详细说说如何使用C#语言来在MAC 操作系统下创建Unity本地数据库,我是C#控哇咔咔~~~
首先你需要得到Mono.Data.Sqlite.dll 文件 与System.Data.dll文件。如果你在Mac 操作系统下使用Unity那么很悲剧,找不到这两个文件,至少我没能找到。后来我在Windows下的Unity安装路径中找到了它。为了方便大家我将这两个文件上传至网盘中,如果没有这两个文件的朋友请下载。
下载地址:
.zip文件下载完毕后直接解压,然后将Mono.Data.Sqlite.dll 文件 与System.Data.dll文件放在Unity工程中的Assets文件夹中。如下图所示,两个文件已经放置在Project视图当中。
Ok ,我们编写C#脚本,原始文章没有Unity数据库更新与删除的方法,我在这里加上更新与删除的方法,方便大家开发时使用。因为其实Unity中更新与删除数据库也是个比较重要的功能。
注意:下面脚本不要绑定在任何游戏对象身上,大家无需把它当作脚本可以当作一个工具类来使用。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
using UnityEngine;&using System;using System.Collections;using Mono.Data.Sqlite;&public class DbAccess&{&&&&&private SqliteConnection dbConnection;&&&&&private SqliteCommand dbCommand;&&&&&private SqliteDataReader reader;&&&&&public DbAccess (string connectionString)&&&&&{&&&&&&&&&OpenDB (connectionString);&&&&&}&&&&public DbAccess () {& }&&&&&public void OpenDB (string connectionString)&&&&&{
{&&&&&&&& dbConnection = new SqliteConnection (connectionString);&&&&&&&
dbConnection.Open ();&&&&&&&
Debug.Log ("Connected to db");
}&&&& catch(Exception e)&&&& {&&&&&&
string temp1 = e.ToString();&&&&&&
Debug.Log(temp1);&&&& }&&&&&}&&&&&public void CloseSqlConnection ()&&&&&{&&&&&&&&&if (dbCommand != null) {&&&&&&&&&&&&&dbCommand.Dispose ();&&&&&&&&&}&&&&&&&&&dbCommand = null;&&&&&&&&&if (reader != null) {&&&&&&&&&&&&&reader.Dispose ();&&&&&&&&&}&&&&&&&&&reader = null;&&&&&&&&&if (dbConnection != null) {&&&&&&&&&&&&&dbConnection.Close ();&&&&&&&&&}&&&&&&&&&dbConnection = null;&&&&&&&&&Debug.Log ("Disconnected from db.");&&&&&}&&&&&public SqliteDataReader ExecuteQuery (string sqlQuery)&&&&&{&&&&&&&&&dbCommand = dbConnection.CreateCommand ();&&&&&&&&&dbCommand.CommandText = sqlQuery;&&&&&&&&&reader = dbCommand.ExecuteReader ();&&&&&&&&&return reader;&&&&&}&&&&&public SqliteDataReader ReadFullTable (string tableName)&&&&&{&&&&&&&&&string query = "SELECT * FROM " + tableName;&&&&&&&&&return ExecuteQuery (query);&&&&&}&&&&&public SqliteDataReader InsertInto (string tableName, string[] values)&&&&&{&&&&&&&&&string query = "INSERT INTO " + tableName + " VALUES (" + values[0];&&&&&&&&&for (int i = 1; i & values.Length; ++i) {&&&&&&&&&&&&&query += ", " + values[i];&&&&&&&&&}&&&&&&&&&query += ")";&&&&&&&&&return ExecuteQuery (query);&&&&&}& public SqliteDataReader UpdateInto (string tableName, string []cols,string []colsvalues,string selectkey,string selectvalue) {&
string query = "UPDATE "+tableName+" SET "+cols[0]+" = "+colsvalues[0];&
for (int i = 1; i & colsvalues.Length; ++i) {&
query += ", " +cols[i]+" ="+ colsvalues[i];
query += " WHERE "+selectkey+" = "+selectvalue+" ";&
return ExecuteQuery (query); }& public SqliteDataReader Delete(string tableName,string []cols,string []colsvalues) {
string query = "DELETE FROM "+tableName + " WHERE " +cols[0] +" = " + colsvalues[0];&
for (int i = 1; i & colsvalues.Length; ++i) {&
&&&&query += " or " +cols[i]+" = "+ colsvalues[i];
Debug.Log(query);
return ExecuteQuery (query); }&&&&&public SqliteDataReader InsertIntoSpecific (string tableName, string[] cols, string[] values)&&&&&{&&&&&&&&&if (cols.Length != values.Length) {&&&&&&&&&&&&&throw new SqliteException ("columns.Length != values.Length");&&&&&&&&&}&&&&&&&&&string query = "INSERT INTO " + tableName + "(" + cols[0];&&&&&&&&&for (int i = 1; i & cols.Length; ++i) {&&&&&&&&&&&&&query += ", " + cols[i];&&&&&&&&&}&&&&&&&&&query += ") VALUES (" + values[0];&&&&&&&&&for (int i = 1; i & values.Length; ++i) {&&&&&&&&&&&&&query += ", " + values[i];&&&&&&&&&}&&&&&&&&&query += ")";&&&&&&&&&return ExecuteQuery (query);&&&&&}&&&&&public SqliteDataReader DeleteContents (string tableName)&&&&&{&&&&&&&&&string query = "DELETE FROM " + tableName;&&&&&&&&&return ExecuteQuery (query);&&&&&}&&&&&public SqliteDataReader CreateTable (string name, string[] col, string[] colType)&&&&&{&&&&&&&&&if (col.Length != colType.Length) {&&&&&&&&&&&&&throw new SqliteException ("columns.Length != colType.Length");&&&&&&&&&}&&&&&&&&&string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0];&&&&&&&&&for (int i = 1; i & col.Length; ++i) {&&&&&&&&&&&&&query += ", " + col[i] + " " + colType[i];&&&&&&&&&}&&&&&&&&&query += ")";&&&&&&&&&return ExecuteQuery (query);&&&&&}&&&&&public SqliteDataReader SelectWhere (string tableName, string[] items, string[] col, string[] operation, string[] values)&&&&&{&&&&&&&&&if (col.Length != operation.Length ?? operation.Length != values.Length) {&&&&&&&&&&&&&throw new SqliteException ("col.Length != operation.Length != values.Length");&&&&&&&&&}&&&&&&&&&string query = "SELECT " + items[0];&&&&&&&&&for (int i = 1; i & items.Length; ++i) {&&&&&&&&&&&&&query += ", " + items[i];&&&&&&&&&}&&&&&&&&&query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' ";&&&&&&&&&for (int i = 1; i & col.Length; ++i) {&&&&&&&&&&&&&query += " AND " + col[i] + operation[i] + "'" + values[0] + "' ";&&&&&&&&&}&&&&&&&&&return ExecuteQuery (query);&&&&&}&}
首先是创建本地数据库,我们创建C#脚本Test.cs直接绑定在摄像机中。
12345678910111213141516171819
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour{& void Start () {& &&&&//创建数据库名称为xuanyusong.db
DbAccess db = new DbAccess("data source=xuanyusong.db");&
//创建数据库表,与字段
db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"});&&&&&&&&//关闭对象
db.CloseSqlConnection(); }&}
运行游戏后,数据库对象会自动生成在项目的根目录中。查看数据库的软件我使用的是Navicat Premium,如果没有请大家下载,然后继续。如下图所示,数据库文件xuanyusong.db已经生成在项目的根目录中,接着我使用Navicat Premium软件将这个数据库打开。数据库的表名为momo 打开表后字段包含name、
blog。都是我们在代码中创建的。
(点击查看大图)
OK,我们继续。首先是插入数据,记得将编码修改成UTF-16 不然中文会乱码。
1234567891011121314151617
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour{& void Start () {& &&&&//创建数据库名称为xuanyusong.db
DbAccess db = new DbAccess("data source=xuanyusong.db");
//请注意 插入字符串是 已经要加上'宣雨松' 不然会报错
db.InsertInto("momo", new string[]{ "'宣雨松'","''","''","''"&& });
db.CloseSqlConnection(); }&}
接着是更新数据。UpdateInto是我新写的方法,接受更新多条数据。
123456789101112131415161718
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour{& void Start () {& &&&&//创建数据库名称为xuanyusong.db
DbAccess db = new DbAccess("data source=xuanyusong.db");&
db.UpdateInto("momo",new string[]{"name","qq"},new string[]{"'xuanyusong'","''"}, "email", "''"&&);&
db.CloseSqlConnection(); }&}
然后是删除数据DELETE也是我封装的方法。
12345678910111213141516171819202122232425
using UnityEngine;using System.Collections;&public class Test : MonoBehaviour{& void Start () {& &&&&//创建数据库名称为xuanyusong.db
DbAccess db = new DbAccess("data source=xuanyusong.db");
//请注意 插入字符串是 已经要加上'宣雨松' 不然会报错
db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"});
//我在数据库中连续插入三条数据
db.InsertInto("momo", new string[]{ "'宣雨松'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'雨松MOMO'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'哇咔咔'","''","''","''"&& });&
//然后在删掉两条数据
db.Delete("momo",new string[]{"email","email"}, new string[]{"''","''"}&&);&
db.CloseSqlConnection(); }&}
最后是查找数据。
12345678910111213141516171819202122232425262728293031323334
using UnityEngine;using System.Collections;&using Mono.Data.Sqlite;public class Test : MonoBehaviour{& void Start () {& &&&&//创建数据库名称为xuanyusong.db
DbAccess db = new DbAccess("data source=xuanyusong.db");
//请注意 插入字符串是 已经要加上'宣雨松' 不然会报错
db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"});
//我在数据库中连续插入三条数据
db.InsertInto("momo", new string[]{ "'宣雨松'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'雨松MOMO'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'哇咔咔'","''","''","''"&& });&
//然后在删掉两条数据
db.Delete("momo",new string[]{"email","email"}, new string[]{"''","''"}&&);&
SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{""});&
while (sqReader.Read())&&&& {&&&&
Debug.Log(sqReader.GetString(sqReader.GetOrdinal("name")) + sqReader.GetString(sqReader.GetOrdinal("email")));&&&& } &
db.CloseSqlConnection(); }&}
注解1:这里的结构非常像安卓的数据库指针,然后while循环把每一条数据都取出来。 sqReader.Gerordinal()方法就是拿到对应列名称的数据。如下图所示,经过一些列的添加与删除的操作最后数据库的内容如下。
如下图所示,我使用Log也将数据库name 与 email的字段打印了出来。最后我在强调一点,我们在OnStart方法中db.CreateTable创建数据库表,如果重复创建系统会抛出错误。避免这个情况请保证你的数据库表只会被创建一次。祝大家学习愉快嘎嘎嘎~~~
留言中看到有朋友说报错,那么MOMO将我的工程打包,提供下在地址
Unity 使用SQLite本地数据库的下载地址如下:
如下图所示,请先在PlaySettings中修改Api Compatibility Level 改成.NET 2.0,如果不修改会报错
注意:Error building Player: Extracting referenced dlls failed.
无论你编译任何平台都请修改一下这里, 留言中有朋友在编译PC平台中 因为没有修改这里导致无法编译成功。。
IOS平台SQLite的使用:
然后需要修改Test.cs的脚本,在修改一下数据库保存的路径,我们将数据库放在沙盒当中。这样IOS中才可以读取数据库。
1234567891011121314151617181920212223242526272829303132333435363738394041424344
using UnityEngine;using System.Collections;&using Mono.Data.Sqlite;public class Test : MonoBehaviour{& void Start () {
//数据库文件储存地址
string appDBPath = Application.persistentDataPath + "/xuanyusong.db";&
DbAccess db = new DbAccess(@"Data Source=" + appDBPath);&
//请注意 插入字符串是 已经要加上'宣雨松' 不然会报错
db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"});
//我在数据库中连续插入三条数据
db.InsertInto("momo", new string[]{ "'宣雨松'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'雨松MOMO'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'哇咔咔'","''","''","''"&& });&
//然后在删掉两条数据
db.Delete("momo",new string[]{"email","email"}, new string[]{"''","''"}&&);&
using (SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{""}))
while (sqReader.Read())&&&&
//目前中文无法显示&&&&
Debug.Log(sqReader.GetString(sqReader.GetOrdinal("name")));&
Debug.Log(sqReader.GetString(sqReader.GetOrdinal("email")));&&&&&
sqReader.Close();
db.CloseSqlConnection(); }&}
下面开始打包成IOS版本,直接运行如下图所示,已经在XCODE的控制台中将字符串信息打印出来。目前我不知道如何读取中文,但是可以确定的是中文信息已经写入数据库中。不信大家可以打开沙盒看看。
Android平台SQLite的使用:
Android与IOS在使用SQLite数据库时有点区别,Android需要将第三方DLL放在Plugins当中。脚本也需要修改一下,先看看Test.cs的改动。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
using UnityEngine;using System.Collections;&using Mono.Data.Sqlite;public class Test : MonoBehaviour{& void Start () {
//数据库文件储存地址&
string appDBPath = Application.persistentDataPath&&+ "/xuanyusong.db";&
//注意!!!!!!!这行代码的改动
DbAccess db = new DbAccess("URI=file:" + appDBPath);&
//请注意 插入字符串是 已经要加上'宣雨松' 不然会报错
db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"});
//我在数据库中连续插入三条数据
db.InsertInto("momo", new string[]{ "'宣雨松'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'雨松MOMO'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'哇咔咔'","''","''","''"&& });&
//然后在删掉两条数据
db.Delete("momo",new string[]{"email","email"}, new string[]{"''","''"}&&);&
using (SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{""}))
while (sqReader.Read())&&&&
Debug.Log("xuanyusong" + sqReader.GetString(sqReader.GetOrdinal("name")));&
Debug.Log("xuanyusong" + sqReader.GetString(sqReader.GetOrdinal("email")));&&&&&
sqReader.Close();
db.CloseSqlConnection(); }& void Update() {
if (Input.GetKeyDown(KeyCode.Escape) ??Input.GetKeyDown(KeyCode.Home) )&&&&&&&&{&&&&&&&&&&&&&Application.Quit();&&&&&&&&} }&}
如下图所示,Player Settings 请和我保持一致。
值得庆幸的是在Android下读取数据库时正常的显示了中文。如下图所示,运行打包后的程序后在Eclipse的后台已经能看到数据库显示的中文与英文,呵呵。
由于工程中需要一些DLL,所以我将工程的下载地址放出,请大家下载。
MAC平台下的使用:
请先下载原始版本
我们只需在原始版本之上进行修改即可。
修改Test.cs文件
,请注意我在代码中标注的内容。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
using UnityEngine;using System.Collections;&using Mono.Data.Sqlite;public class Test : MonoBehaviour{& string name = null; string email = null; string appDBPath = null; void Start () {&//////////--------
//请注意!!!!!!!
//这里的修改&
appDBPath = Application.dataPath + "/xuanyusong.db";&&&&&&&&&DbAccess db = new DbAccess(@"Data Source=" + appDBPath);&//////////--------&
//请注意 插入字符串是 已经要加上'宣雨松' 不然会报错
db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"});
//我在数据库中连续插入三条数据
db.InsertInto("momo", new string[]{ "'宣雨松'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'雨松MOMO'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'哇咔咔'","''","''","''"&& });&
//然后在删掉两条数据
db.Delete("momo",new string[]{"email","email"}, new string[]{"''","''"}&&);&
SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{""});&
while (sqReader.Read())&&&& { &&&&&
Debug.Log(sqReader.GetString(sqReader.GetOrdinal("name")) + sqReader.GetString(sqReader.GetOrdinal("email"))); &
name = sqReader.GetString(sqReader.GetOrdinal("name"));
email = sqReader.GetString(sqReader.GetOrdinal("email"));&&&& } &
db.CloseSqlConnection(); }& void OnGUI() {&
///为了让大家看的更清楚 我将数据库取出的内容显示在屏幕中
if(name != null)
GUILayout.Label("XXXXXXXXXXXXX" + name);&
if (email!= null)
GUILayout.Label("XXXXXXXXXXXXX" + email);
if(appDBPath != null)
GUILayout.Label("数据库的路径" + appDBPath);
生成工程后,运行生成的mac程序,我们可以看到 数据已经取出来了。
Windows平台SQLite的使用:
Windows平台下与Mac平台有点区别,废了老半天来找到问题所在。MOMO感谢在博客后面留言的朋友,因为没有你们的留言我也不会去研究MAC
Windows下如何使用 呵呵。
进入正题,还是先修改Test.cs文件
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
using System.Collections;&using Mono.Data.Sqlite;&//using Mono.Data.SqliteC&public class Test : MonoBehaviour{& string&&name = null; string&&email = null; string path = null;& void Start () {
//数据库文件储存地址& //注意这里的修改!!!!!!!!!!!!!!
string appDBPath = Application.dataPath&&+ "/xuanyusong.db";& //--------------------------&
DbAccess db = new DbAccess(@"Data Source=" + appDBPath);&
path = appDBPath;&
//请注意 插入字符串是 已经要加上'宣雨松' 不然会报错
db.CreateTable("momo",new string[]{"name","qq","email","blog"}, new string[]{"text","text","text","text"});
//我在数据库中连续插入三条数据
db.InsertInto("momo", new string[]{ "'宣雨松'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'雨松MOMO'","''","''","''"&& });
db.InsertInto("momo", new string[]{ "'哇咔咔'","''","''","''"&& });&
//然后在删掉两条数据
db.Delete("momo",new string[]{"email","email"}, new string[]{"''","''"}&&);&
using (SqliteDataReader sqReader = db.SelectWhere("momo",new string[]{"name","email"},new string[]{"qq"},new string[]{"="},new string[]{""}))
while (sqReader.Read())&&&&
//目前中文无法显示&&&&
Debug.Log("xuanyusong" + sqReader.GetString(sqReader.GetOrdinal("name")));&
Debug.Log("xuanyusong" + sqReader.GetString(sqReader.GetOrdinal("email")));&
name = sqReader.GetString(sqReader.GetOrdinal("name"));
email = sqReader.GetString(sqReader.GetOrdinal("email"));&&&&&
sqReader.Close();
db.CloseSqlConnection(); }& void OnGUI() {
if(name != null)
GUILayout.Label(name);
if(email != null)
GUILayout.Label(email);
if(path != null)
GUILayout.Label(path);
如下图所示打开Unity然后我们需要下载sqlite3.dll文件,接着将dll都放入Plugins文件夹中。不用担心 稍后我会把真个工程的下载地址贴出来其中包括所有的dll 。
最后直接打包成Windows平台工程。双击运行.exe文件,如下图所示数据库的数据以及路径MOMO已经打印在屏幕当中啦。哇咔咔~ 然后xuanyusong.db文件就放在ddd_Date文件夹中,我已经用红圈标注出来了。ddd就是工程的名称,ddd_Date该文件夹是自动生成的。
(点击图片查看大图)
最后这个工程的下载地址,包括所有DLL以及代码MOMO感谢大家的支持。
下载地址:
最后祝大家学习愉快。
我发现留言中有很多朋友都问我
: SqliteException: SQLite errornear “″: syntax error 这样的错误。
这几天我抽时间看一下这个问题,出现这个问题应该是你需要在程序中载入第三方数据库,而不是自己创建数据库。
解决这个问题的办法其实很简单,当你程序发布以后。 windows下会生成 xx.exe 和 xx_Data文件夹,这时候你把你的第三方数据库拷贝进去就可以,因为我发现编辑模式下assets文件夹中的db文件打包生成windows的以后,这db文件不会完整的拷贝,在xx_Data文件夹中的db文件变成了0KB 。
在MAC OS 中也一样,unity也不会完整的拷贝。只需把数据库拷贝至 对应的路径下就可以。
如果你是在使用移动平台,可以参考
本文固定链接:
转载请注明:
MOMO与MO嫂提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!您的位置: &
实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本实验将使用5中方法完成这个过程,并详细记录各种方法所耗费的时间。
  本实验中所用到工具为VS2008和SQL SERVER 2000、SQL SERVER 2008,分别使用5中方法将100万条数据导入SQL 2000与SQL 2008中,实验环境是DELL GCPU,2G内存的服务器。感兴趣的朋友可以下载源代码自己验证一下所用时间。
  还要有一点需要进行说明,本实验中执行SQL语句的地方使用了IsLine FrameWork框架中的DataProvider模块,这个模块只是对SQL配置的读取和封装,并不会对最终结果有本质性的影响,关于IsLine FrameWork框架方面的知识,请参考&IsLine FrameWork&框架系列文章。
  下面进入正题,分别使用基本的Insert 语句、使用BULK INSERT语句、在多线程中使用BULK INSERT、使用SqlBulkCopy类、在多线程中使用SqlBulkCopy类五种方法,挑战4秒极限。
  数据库方面使用SQL 2000与SQL 2008,表名TableB,字段名称为Value1,数据库名可以在App.config中修改,默认为test。
图 1 试验中的5种方法
  方法一.使用基本的Insert 语句
  这种方法是最基本的方法,大多数人一开始都会想到这种方法。但是Insert语句似乎并不适合大批量的操作,是不是这样呢?
  本方法中将100万数据分为10个批次,每个批次10万条,每10万条1个事务,分10次导入数据库。
  基本语句:Insert Into TableB (Value1) values (&&+i+&&);
  说明:语句中的i是宿主程序中的一个累加变量,用于填充数据库字段中的值。
  SQL 2000 耗时:901599
  SQL 2008耗时:497638
  方法二.使用BULK INSERT语句
  这个类的效果,在本实验中可以说是最令人满意的了,它的使用最简便、灵活,速度很快。
  &BULK INSERT&语句似乎不是很常用, Aicken听说Oracle中有一种可以将外部文件映射为Oracle临时表,然后直接将临时表中的数据导入Oracle其他表中的方法,这种方法的速度非常令人满意,SQL SERVER的BULK INSERT是不是同样令人满意呢?
  基本语句:BULK INSERT TableB FROM 'c:\\sql.txt' WITH (FIELDTERMINATOR = ',',ROWTER /.,mbMINATOR='|',BATCHSIZE = 100000)
  说明:&c:\\sql.txt&是一个预先生成的包含100条数据的文件,这些数据以&|&符号分隔,每10万条数据一个事务。
  SQL 2000耗时:4009
  SQL 2008耗时:10722
  方法三.在多线程中使用BULK INSERT
  在方法二的基础上,将100万条数据分五个线程,每个线程负责20万条数据,每5万条一个事物,五个线程同时启动,看看这样的效果吧。
  SQL 2000耗时:21099
  SQL 2008耗时:10997
  方法四.使用SqlBulkCopy类
  这种方法速度也很快,但是要依赖内存,对于几千万条、多字段的复杂数据,可能在内存方面会有较大的消耗,不过可以使用64位解决方案处理这个问题。
  几千万条、多字段的数据的情况一般在一些业务场景中会遇到,比如计算全球消费者某个业务周期消费额时,要先获得主数据库表中的会员消费记录快照,并将快照储存至临时表中,然后供计算程序使用这些数据。并且有些时候消费者的消费数据并不在一台数据库服务器中,而是来自多个国家的多台服务器,这样我们就必须借助内存或外存设备中转这些数据,然后清洗、合并、检测,最后导入专用表供计算程序使用。
  基本语句:
using (System.Data.SqlClient.SqlBulkCopy sqlBC = new System.Data.SqlClient.SqlBulkCopy(conn))
sqlBC.BatchSize = 100000;
sqlBC.BulkCopyTimeout = 60;
sqlBC.DestinationTableName = "dbo.TableB";
sqlBC.ColumnMappings.Add("valueA", "Value1");
sqlBC.WriteToServer(dt);
  说明:
  BatchSize = 100000; 指示每10万条一个事务并提交
  BulkCopyTimeout = 60; 指示60秒按超时处理
  DestinationTableName = "dbo.TableB"; 指示将数据导入TableB表
  ColumnMappings.Add("valueA", "Value1"); 指示将内存中valueA字段与TableB中的Value1字段匹配
  WriteToServer(dt);写入数据库。其中dt是预先构建好的DataTable,其中包含valueA字段。
  SQL 2000耗时:4989
  SQL 2008耗时:10412
  方法五.在多线程中使用SqlBulkCopy类
  基于方法四,将100万条数据分五个线程,每个线程负责20万条数据,每5万条一个事物,五个线程同时启动,看看这样的效果吧。
  SQL 2000耗时:7682
  SQL 2008耗时:10870
&&&&&&&&&& 数据库测试方式
基本Insert Into
单线程Bulk Insert
多线程Bulk Insert
单线程SqlBulkCopy
多线程SqlBulkCopy
  以上就是这几天的实验结果了,比较令人失望的是SQL SERVER 2008导入数据的性能似乎并不想我们想象的那样优秀。
  另外,有下载源代码的帮我看看,为什么多线程的成绩还不如单线程的优秀呢?是静态资源使用不当造成的,还是其他什么原因?
  源码地址:
  测试数据下载地址:
上一篇:下一篇:

我要回帖

更多关于 数据库添加字段 的文章

 

随机推荐