C#学习教程:在C#中将DataTable转换为SQL的CREATETABLE+INSERT脚本这不是插入。除此之外,我还需要创建表(相同的数据结构)所以:我有一个充满数据的数据表。我想要一个TSQL脚本来创建此DataTable的结构以及SQLSERVER中的数据(CREATETABLE+INSERT)在此先感谢并特别感谢JohnSaunders帮助我更正此问题。首先,我将使用此对象来构建您的CREATETABLE命令。使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.Data.SqlClient;使用系统数据;namespaceToolkit{publicclassSqlTableCreator{#region实例变量privateSqlConnection_connection;公共SqlConnection连接{得到{返回_connection;}设置{_connection=值;}}私人SqlTransaction_transaction;publicSqlTransactionTransaction{get{return_transaction;}设置{_transaction=值;}}私有字符串_tableName;公共字符串DestinationTableName{get{return_tableName;}设置{_tableName=值;}}#endregion#regionConstructorpublicSqlTableCreator(){}publicSqlTableCreator(SqlConnectionconnection):this(connection,null){}publicSqlTableCreator(SqlConnectionconnection,SqlTransactiontransaction){_connection=connection;_transaction=交易;}#endregion#region实例方法publicobjectCreate(DataTableschema){returnCreate(模式,空);}publicobjectCreate(DataTableschema,intnumKeys){int[]primaryKeys=newint[numKeys];对于(inti=0;i0);if(hasKeys){//用户定义的键foreach(intkeyinprimaryKeys){pk+=schema.Rows[key]["ColumnName"].ToString()+",";}}else{//检查模式中的键stringkeys=string.Join(",",GetPrimaryKeys(schema));pk+=键;hasKeys=keys.Length>0;}pk=pk.TrimEnd(newchar[]{',','','n'})+")n";如果(hasKeys)sql+=pk;sql+=")";返回sql;}publicstaticstringGetCreateFromDataTableSQL(stringtableName,DataTabletable){stringsql="CREATETABLE["+tableName+"](n";//columnsforeach(DataColumncolumnintable.Columns){sql+="["+column.ColumnName+"]"+SQLGetType(column)+",n";}sql=sql.TrimEnd(newchar[]{',','n'})+"n";//主键if(table.PrimaryKey.Length>0){sql+="CONSTRAINT[PK_"+tableName+"]PRIMARYKEYCLUSTERED(";foreach(DataColumncolumnintable.PrimaryKey){sql+="["+column.ColumnName+"],";}sql=sql.TrimEnd(newchar[]{','})+"))n";}//ifnotendswith")"if((table.PrimaryKey.Length==0)&&(!sql.EndsWith(")"))){sql+=")";}返回SQL;}publicstaticstring[]GetPrimaryKeys(DataTableschema){列表键=newList();foreach(schema.Rows中的数据行列){if(schema.Columns.Contains("IsKey")&&(bool)column["IsKey"])keys.Add(column["ColumnName"].ToString());}返回keys.ToArray();}//返回T-SQL数据类型定义,基于列的模式定义“:返回“VARCHAR(”+((columnSize==-1)?“255”:(columnSize>8000)?“MAX”:columnSize.ToString())+“)”;case"System.Decimal":if(numericScale>0)return"REAL";elseif(numericPrecision>10)返回“BIGINT”;否则返回“INT”;加州se"System.Double":case"System.Single":return"REAL";案例“System.Int64”:返回“BIGINT”;案例“System.Int16”:案例“System.Int32”:返回“INT”;case"System.DateTime":返回"DATETIME";case"System.Boolean":返回"BIT";案例“System.Byte”:返回“TINYINT”;case"System.Guid":返回"UNIQUEIDENTIFIER";默认值:抛出新异常(type.ToString()+“未实现。”);}}//基于模式表中的行重载publicstaticstringSQLGetType(DataRowschemaRow){returnSQLGetType(schemaRow["DataType"],int.Parse(schemaRow["ColumnSize"].ToString()),int.Parse(schemaRow["NumericPrecision"].ToString()),int.Parse(schemaRow["NumericScale"].ToString()));}//基于DataTable类型的DataColumn重载publicstaticstringSQLGetType(DataColumncolumn){returnSQLGetType(column.DataType,column.MaxLength,10,2);}#endregion}}然后我会使用SQLBulkCopy而不是单独的INSERT语句publicstaticvoidBulkInsertDataTable(stringconnectionString,stringtableName,DataTabletable){using(SqlConnectionconnection=newSqlConnection(connectionString)){SqlBulkCopybulkCopy=newSqlBulkCopy(connection,SqlBulkCopyOptions.TableLock|SqlBulkCopyOptions.FireTriggers|SqlBulkCopyOptions.UseInternalTransaction,null);bulkCopy.DestinationTableName=tableName;connection.Open();bulkCopy.WriteToServer(表);connection.Close();}}publicvoidcreatesqltable(DataTabledt,stringtablename){stringstrconnection="";字符串表="";table+="IFNOTEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].["+tablename+"]')ANDtypein(N'U'))";表格+=“开始”;表+=“创建表”+表名+“”;table+="(";for(inti=0;i看一看:以编程方式生成SQLINSERT命令本质上,代码循环遍历DataTable.Columns集合以生成INSERT语句的列列表。然后循环遍历值DataTable以创建带有值的参数。如果要从表创建插入脚本,请使用我创建的工具。这将根据给定条件在多个表上创建插入脚本:IFNOTEXISTS(Select1fromTable1WHERECol1='Col1'ANDCol2='Col2')INSERTINTOTable1(Col1,Col2,Col3,Col4)VALUES(1,'abc',null,'2012-01-01')链接如下:http://www.codeproject.com/Tips/330864/Generate-Insert-script-to-extract-data以上是C#学习教程:ConvertDataTabletoSQLC#CREATETABLE+INSERTscript分享所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文来自网络收集,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
