[.net] 将 datatable 存储到数据库
      最近有这样的任务,需要将datatable 中的数据存储到数据库。以前有写过类似的解决方案,主要是利用 SqlCommand 对象结合 sql 查询语句实现。请看下面的代码片段:
上面的工作显得非常繁琐。
我经常想,datatable 和数据库中的表本质是一样的,存储应该是一个函数,一句话的
事情。
下面我就用一个函数 show 给大家看。
      
上面利用了。net 2。0 新加入的几个数据库操作类型。请务必先引入以下几个组建:
Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SqlEnum
和如下名字空间:
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Server;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer;
下面是测试代码:
            
         
另上传该测试程序:
/Files/dxfcv222/ConsoleApplication1.rar
 1 //创建表格
          //创建表格
2 string creatingString = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[" + Table_Name + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[" + Table_Name + "]" +
            string creatingString = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[" + Table_Name + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[" + Table_Name + "]" +
3 "CREATE TABLE [dbo].[" + Table_Name + "] (" +
                    "CREATE TABLE [dbo].[" + Table_Name + "] (" +
4 "[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
                    "[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
5 "[account] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
                    "[account] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
6 "[ShipName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
                    "[ShipName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
7 "[LevelMove] [int] NULL ," +
                    "[LevelMove] [int] NULL ," +
8 "[ExpMove] [int] NULL ," +
                    "[ExpMove] [int] NULL ," +
9 "[LevelFight] [int] NULL ," +
                    "[LevelFight] [int] NULL ," +
10 "[ExpFight] [int] NULL ," +
                    "[ExpFight] [int] NULL ," +
11 "[LevelLoad] [int] NULL ," +
                    "[LevelLoad] [int] NULL ," +
12 "[ExpLoad] [int] NULL ," +
                    "[ExpLoad] [int] NULL ," +
13 ") ON [PRIMARY]";
                    ") ON [PRIMARY]";
14
15 SqlCommand sqlCommand = new SqlCommand(creatingString, _databaseConnection as SqlConnection);
            SqlCommand sqlCommand = new SqlCommand(creatingString, _databaseConnection as SqlConnection);
16 sqlCommand.ExecuteNonQuery();
            sqlCommand.ExecuteNonQuery();
 //创建表格
          //创建表格2
 string creatingString = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[" + Table_Name + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[" + Table_Name + "]" +
            string creatingString = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[" + Table_Name + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[" + Table_Name + "]" +3
 "CREATE TABLE [dbo].[" + Table_Name + "] (" +
                    "CREATE TABLE [dbo].[" + Table_Name + "] (" +4
 "[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
                    "[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +5
 "[account] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
                    "[account] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +6
 "[ShipName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +
                    "[ShipName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ," +7
 "[LevelMove] [int] NULL ," +
                    "[LevelMove] [int] NULL ," +8
 "[ExpMove] [int] NULL ," +
                    "[ExpMove] [int] NULL ," +9
 "[LevelFight] [int] NULL ," +
                    "[LevelFight] [int] NULL ," +10
 "[ExpFight] [int] NULL ," +
                    "[ExpFight] [int] NULL ," +11
 "[LevelLoad] [int] NULL ," +
                    "[LevelLoad] [int] NULL ," +12
 "[ExpLoad] [int] NULL ," +
                    "[ExpLoad] [int] NULL ," +13
 ") ON [PRIMARY]";
                    ") ON [PRIMARY]";14

15
 SqlCommand sqlCommand = new SqlCommand(creatingString, _databaseConnection as SqlConnection);
            SqlCommand sqlCommand = new SqlCommand(creatingString, _databaseConnection as SqlConnection);16
 sqlCommand.ExecuteNonQuery();
            sqlCommand.ExecuteNonQuery(); 1 //插入记录到数据库
      //插入记录到数据库     
2
3 string insertString = "INSERT INTO "+Table_Name+"(name, account, ShipName, LevelMove, ExpMove, LevelFight, ExpFight, LevelLoad, ExpLoad)" +
 string insertString = "INSERT INTO "+Table_Name+"(name, account, ShipName, LevelMove, ExpMove, LevelFight, ExpFight, LevelLoad, ExpLoad)" +
4 "VALUES(@name, @account, @ShipName, @LevelMove, @ExpMove, @LevelFight, @ExpFight, @LevelLoad, @ExpLoad)";
                                                   "VALUES(@name, @account, @ShipName, @LevelMove, @ExpMove, @LevelFight, @ExpFight, @LevelLoad, @ExpLoad)";
5 
            
6 SqlCommand sqlCommand = new SqlCommand(insertString, _databaseConnection as SqlConnection);
            SqlCommand sqlCommand = new SqlCommand(insertString, _databaseConnection as SqlConnection);
7
8 sqlCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = record.PlayerName;
            sqlCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = record.PlayerName;
9 sqlCommand.Parameters.Add("@account", SqlDbType.VarChar, 50).Value = record.PlayerAccount;
            sqlCommand.Parameters.Add("@account", SqlDbType.VarChar, 50).Value = record.PlayerAccount;
10 sqlCommand.Parameters.Add("@ShipName", SqlDbType.VarChar, 50).Value = record.ShipName;
            sqlCommand.Parameters.Add("@ShipName", SqlDbType.VarChar, 50).Value = record.ShipName;
11
12 sqlCommand.Parameters.Add("@LevelMove", SqlDbType.Int, 4).Value = record.LevelMove;
            sqlCommand.Parameters.Add("@LevelMove", SqlDbType.Int, 4).Value = record.LevelMove;
13 sqlCommand.Parameters.Add("@ExpMove", SqlDbType.Int, 4).Value = record.ExpMove;
            sqlCommand.Parameters.Add("@ExpMove", SqlDbType.Int, 4).Value = record.ExpMove;
14 sqlCommand.Parameters.Add("@LevelFight", SqlDbType.Int, 4).Value = record.LevelFight;
            sqlCommand.Parameters.Add("@LevelFight", SqlDbType.Int, 4).Value = record.LevelFight;
15 sqlCommand.Parameters.Add("@ExpFight", SqlDbType.Int, 4).Value = record.ExpFight;
            sqlCommand.Parameters.Add("@ExpFight", SqlDbType.Int, 4).Value = record.ExpFight;
16 sqlCommand.Parameters.Add("@LevelLoad", SqlDbType.Int, 4).Value = record.LevelLoad;
            sqlCommand.Parameters.Add("@LevelLoad", SqlDbType.Int, 4).Value = record.LevelLoad;
17 sqlCommand.Parameters.Add("@ExpLoad", SqlDbType.Int, 4).Value = record.ExpLoad;
            sqlCommand.Parameters.Add("@ExpLoad", SqlDbType.Int, 4).Value = record.ExpLoad;
18
19 sqlCommand.ExecuteNonQuery();
            sqlCommand.ExecuteNonQuery();
20 }
        }
 //插入记录到数据库
      //插入记录到数据库     2

3
 string insertString = "INSERT INTO "+Table_Name+"(name, account, ShipName, LevelMove, ExpMove, LevelFight, ExpFight, LevelLoad, ExpLoad)" +
 string insertString = "INSERT INTO "+Table_Name+"(name, account, ShipName, LevelMove, ExpMove, LevelFight, ExpFight, LevelLoad, ExpLoad)" +4
 "VALUES(@name, @account, @ShipName, @LevelMove, @ExpMove, @LevelFight, @ExpFight, @LevelLoad, @ExpLoad)";
                                                   "VALUES(@name, @account, @ShipName, @LevelMove, @ExpMove, @LevelFight, @ExpFight, @LevelLoad, @ExpLoad)";5
 
            6
 SqlCommand sqlCommand = new SqlCommand(insertString, _databaseConnection as SqlConnection);
            SqlCommand sqlCommand = new SqlCommand(insertString, _databaseConnection as SqlConnection);7

8
 sqlCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = record.PlayerName;
            sqlCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = record.PlayerName;9
 sqlCommand.Parameters.Add("@account", SqlDbType.VarChar, 50).Value = record.PlayerAccount;
            sqlCommand.Parameters.Add("@account", SqlDbType.VarChar, 50).Value = record.PlayerAccount;10
 sqlCommand.Parameters.Add("@ShipName", SqlDbType.VarChar, 50).Value = record.ShipName;
            sqlCommand.Parameters.Add("@ShipName", SqlDbType.VarChar, 50).Value = record.ShipName;11

12
 sqlCommand.Parameters.Add("@LevelMove", SqlDbType.Int, 4).Value = record.LevelMove;
            sqlCommand.Parameters.Add("@LevelMove", SqlDbType.Int, 4).Value = record.LevelMove;13
 sqlCommand.Parameters.Add("@ExpMove", SqlDbType.Int, 4).Value = record.ExpMove;
            sqlCommand.Parameters.Add("@ExpMove", SqlDbType.Int, 4).Value = record.ExpMove;14
 sqlCommand.Parameters.Add("@LevelFight", SqlDbType.Int, 4).Value = record.LevelFight;
            sqlCommand.Parameters.Add("@LevelFight", SqlDbType.Int, 4).Value = record.LevelFight;15
 sqlCommand.Parameters.Add("@ExpFight", SqlDbType.Int, 4).Value = record.ExpFight;
            sqlCommand.Parameters.Add("@ExpFight", SqlDbType.Int, 4).Value = record.ExpFight;16
 sqlCommand.Parameters.Add("@LevelLoad", SqlDbType.Int, 4).Value = record.LevelLoad;
            sqlCommand.Parameters.Add("@LevelLoad", SqlDbType.Int, 4).Value = record.LevelLoad;17
 sqlCommand.Parameters.Add("@ExpLoad", SqlDbType.Int, 4).Value = record.ExpLoad;
            sqlCommand.Parameters.Add("@ExpLoad", SqlDbType.Int, 4).Value = record.ExpLoad;18

19
 sqlCommand.ExecuteNonQuery();
            sqlCommand.ExecuteNonQuery();20
 }
        }上面的工作显得非常繁琐。
我经常想,datatable 和数据库中的表本质是一样的,存储应该是一个函数,一句话的
事情。
下面我就用一个函数 show 给大家看。
 1 public static void Table2Db(DataTable dt, SqlConnection connection, string dbName)
        public static void Table2Db(DataTable dt, SqlConnection connection, string dbName)
2 {
        {
3 Debug.Assert(dt != null);
            Debug.Assert(dt != null);
4 Debug.Assert(connection != null);
            Debug.Assert(connection != null);
5 Debug.Assert(connection.State == ConnectionState.Open);
            Debug.Assert(connection.State == ConnectionState.Open);
6 Debug.Assert(dbName != null);
            Debug.Assert(dbName != null);
7 Debug.Assert(dbName != string.Empty);
            Debug.Assert(dbName != string.Empty);
8
9 Server server = new Server(new ServerConnection(connection));
            Server server = new Server(new ServerConnection(connection));
10 Database db = server.Databases[dbName];
            Database db = server.Databases[dbName];
11 if (db == null)
            if (db == null)
12 {
            {
13 db = new Database(server, dbName);
                db = new Database(server, dbName);
14 db.Create();
                db.Create();
15 }
            }
16
17 Table table = db.Tables[dt.TableName];
            Table table = db.Tables[dt.TableName];
18 if (table == null)
            if (table == null)
19 {
            {
20 table = new Table(db, dt.TableName);
                table = new Table(db, dt.TableName);
21 foreach (DataColumn dc in dt.Columns)
                foreach (DataColumn dc in dt.Columns)
22 {
                {
23 Column column = new Column(table, dc.ColumnName);
                    Column column = new Column(table, dc.ColumnName);
24 column.DataType = DataType.VarChar(50);
                    column.DataType = DataType.VarChar(50);
25 table.Columns.Add(column);
                    table.Columns.Add(column);
26 }
                }
27 table.Create();
                table.Create();
28 }
            }
29
30 using (SqlBulkCopy copy = new SqlBulkCopy(connection))
            using (SqlBulkCopy copy = new SqlBulkCopy(connection))
31 {
            {
32 copy.DestinationTableName = string.Format("[{0}]", dt.TableName);
                copy.DestinationTableName = string.Format("[{0}]", dt.TableName);
33 copy.WriteToServer(dt);
                copy.WriteToServer(dt);
34 }
            }
35
36 Debug.Assert(server != null);
            Debug.Assert(server != null);
37 Debug.Assert(table != null);
            Debug.Assert(table != null);
38 }
        }
 public static void Table2Db(DataTable dt, SqlConnection connection, string dbName)
        public static void Table2Db(DataTable dt, SqlConnection connection, string dbName)2
 {
        {3
 Debug.Assert(dt != null);
            Debug.Assert(dt != null);4
 Debug.Assert(connection != null);
            Debug.Assert(connection != null);5
 Debug.Assert(connection.State == ConnectionState.Open);
            Debug.Assert(connection.State == ConnectionState.Open);6
 Debug.Assert(dbName != null);
            Debug.Assert(dbName != null);7
 Debug.Assert(dbName != string.Empty);
            Debug.Assert(dbName != string.Empty);8

9
 Server server = new Server(new ServerConnection(connection));
            Server server = new Server(new ServerConnection(connection));10
 Database db = server.Databases[dbName];
            Database db = server.Databases[dbName];11
 if (db == null)
            if (db == null)12
 {
            {13
 db = new Database(server, dbName);
                db = new Database(server, dbName);14
 db.Create();
                db.Create();15
 }
            }16

17
 Table table = db.Tables[dt.TableName];
            Table table = db.Tables[dt.TableName];18
 if (table == null)
            if (table == null)19
 {
            {20
 table = new Table(db, dt.TableName);
                table = new Table(db, dt.TableName);21
 foreach (DataColumn dc in dt.Columns)
                foreach (DataColumn dc in dt.Columns)22
 {
                {23
 Column column = new Column(table, dc.ColumnName);
                    Column column = new Column(table, dc.ColumnName);24
 column.DataType = DataType.VarChar(50);
                    column.DataType = DataType.VarChar(50);25
 table.Columns.Add(column);
                    table.Columns.Add(column);26
 }
                }27
 table.Create();
                table.Create();28
 }
            }29

30
 using (SqlBulkCopy copy = new SqlBulkCopy(connection))
            using (SqlBulkCopy copy = new SqlBulkCopy(connection))31
 {
            {32
 copy.DestinationTableName = string.Format("[{0}]", dt.TableName);
                copy.DestinationTableName = string.Format("[{0}]", dt.TableName);33
 copy.WriteToServer(dt);
                copy.WriteToServer(dt);34
 }
            }35

36
 Debug.Assert(server != null);
            Debug.Assert(server != null);37
 Debug.Assert(table != null);
            Debug.Assert(table != null);38
 }
        }上面利用了。net 2。0 新加入的几个数据库操作类型。请务必先引入以下几个组建:
Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SqlEnum
和如下名字空间:
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Server;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer;
下面是测试代码:
 1
2 //------------------------------------------------------------------
        //------------------------------------------------------------------
3
4
5
6 //连接串形成
        //连接串形成
7
8
9 public static string GetConnectionString(string server,
        public static string GetConnectionString(string server,
10 string database,
                    string database,
11 string userName,
                    string userName,
12 string password)
                        string password)
13 {
        {
14
15 return string.Format("server={0};uid={1};pwd={2};database={3}",
            return string.Format("server={0};uid={1};pwd={2};database={3}",
16 server,
                server,
17 userName,
                userName,
18 password,
                password,
19 database);
                database);
20 }
        }
21
22
23 //------------------------------------------------------------------
        //------------------------------------------------------------------
24
25
26
27
28 static void Main(string[] args)
        static void Main(string[] args)
29 {
        {
30
31
32
33
34 //------------------------------------------------------------------
            //------------------------------------------------------------------
35
36 //表格创建
            //表格创建
37
38
39 DataTable dt = new DataTable("1");
            DataTable dt = new DataTable("1");
40
41 dt.Columns.Add("1");
            dt.Columns.Add("1");
42 dt.Columns.Add("2");
            dt.Columns.Add("2");
43 dt.Columns.Add("3");
            dt.Columns.Add("3");
44 dt.Columns.Add("4");
            dt.Columns.Add("4");
45
46
47
48 for (int i = 0; i < 1000; ++i)
            for (int i = 0; i < 1000; ++i)
49 {
            {
50 DataRow dr = dt.NewRow();
                DataRow dr = dt.NewRow();
51
52
53 dr[0] = dr[1] = dr[2] = dr[3] = i;
                dr[0] = dr[1] = dr[2] = dr[3] = i;
54
55
56 dt.Rows.Add(dr);
                dt.Rows.Add(dr);
57
58 }
            }
59
60
61 //------------------------------------------------------------------
            //------------------------------------------------------------------
62
63 //存储到数据库
            //存储到数据库
64
65
66 SqlConnection connection = new SqlConnection(GetConnectionString("192.168.1.79", "nx_server_hotdancing_dxf", "sa", "abc"));
            SqlConnection connection = new SqlConnection(GetConnectionString("192.168.1.79", "nx_server_hotdancing_dxf", "sa", "abc"));
67 connection.Open();
            connection.Open();
68
69 try
            try
70 {
            {
71 Table2Db(dt, connection, "nx_server_hotdancing_dxf");
                Table2Db(dt, connection, "nx_server_hotdancing_dxf");
72 }
            }
73 catch(Exception)
            catch(Exception)
74 {
            {
75 //做点什么?
                //做点什么?
76 }
            }
77
78 connection.Close();
            connection.Close();
79
80
81
82 //------------------------------------------------------------------
            //------------------------------------------------------------------
83
84
85
86 }
        }
87
 
2
 //------------------------------------------------------------------
        //------------------------------------------------------------------3

4

5

6
 //连接串形成
        //连接串形成7

8

9
 public static string GetConnectionString(string server,
        public static string GetConnectionString(string server,10
 string database,
                    string database,11
 string userName,
                    string userName,12
 string password)
                        string password)13
 {
        {14

15
 return string.Format("server={0};uid={1};pwd={2};database={3}",
            return string.Format("server={0};uid={1};pwd={2};database={3}",16
 server,
                server,17
 userName,
                userName,18
 password,
                password,19
 database);
                database);20
 }
        }21

22

23
 //------------------------------------------------------------------
        //------------------------------------------------------------------24

25

26

27

28
 static void Main(string[] args)
        static void Main(string[] args)29
 {
        {30

31

32

33

34
 //------------------------------------------------------------------
            //------------------------------------------------------------------35

36
 //表格创建
            //表格创建37

38

39
 DataTable dt = new DataTable("1");
            DataTable dt = new DataTable("1");40

41
 dt.Columns.Add("1");
            dt.Columns.Add("1");42
 dt.Columns.Add("2");
            dt.Columns.Add("2");43
 dt.Columns.Add("3");
            dt.Columns.Add("3");44
 dt.Columns.Add("4");
            dt.Columns.Add("4");45

46

47

48
 for (int i = 0; i < 1000; ++i)
            for (int i = 0; i < 1000; ++i)49
 {
            {50
 DataRow dr = dt.NewRow();
                DataRow dr = dt.NewRow();51

52

53
 dr[0] = dr[1] = dr[2] = dr[3] = i;
                dr[0] = dr[1] = dr[2] = dr[3] = i;54

55

56
 dt.Rows.Add(dr);
                dt.Rows.Add(dr);57

58
 }
            }59

60

61
 //------------------------------------------------------------------
            //------------------------------------------------------------------62

63
 //存储到数据库
            //存储到数据库64

65

66
 SqlConnection connection = new SqlConnection(GetConnectionString("192.168.1.79", "nx_server_hotdancing_dxf", "sa", "abc"));
            SqlConnection connection = new SqlConnection(GetConnectionString("192.168.1.79", "nx_server_hotdancing_dxf", "sa", "abc"));67
 connection.Open();
            connection.Open();68

69
 try
            try70
 {
            {71
 Table2Db(dt, connection, "nx_server_hotdancing_dxf");
                Table2Db(dt, connection, "nx_server_hotdancing_dxf");72
 }
            }73
 catch(Exception)
            catch(Exception)74
 {
            {75
 //做点什么?
                //做点什么?76
 }
            }77

78
 connection.Close();
            connection.Close();79

80

81

82
 //------------------------------------------------------------------
            //------------------------------------------------------------------83

84

85

86
 }
        }87

另上传该测试程序:
/Files/dxfcv222/ConsoleApplication1.rar
 
                    
                     
                    
                 
                    
                 
        
 
             
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号