我被要求寻找最有效的方法来获取 DataTable 输入并使用 C# 将其写入 SQL Server 表。问题是解决方案必须始终使用 ODBC 连接,这排除了 sqlBulkCopy。该解决方案还必须适用于所有 SQL Server 版本,直至 SQL Server 2008 R2。
我认为最好的方法是使用以下 SQL 语法一次使用 1000 行的批量插入:
INSERT INTO dbo.Table1(Field1, Field2) SELECT Value1, Value2 UNION SELECT Value1, Value2
我已经编写了代码检查与 DataTable 输入对应的表是否已经存在于 SQL Server 上,如果不存在则创建一个。
我还编写了代码来创建 INSERT 语句本身。我正在努力的是如何从数据表中的行动态构建 SELECT 语句。如何访问行中的值来构建我的 SELECT 语句?我想我还需要检查每一列的数据类型,以确定这些值是否需要用单引号 (') 括起来。
这是我当前的代码:
public bool CopyDataTable(DataTable sourceTable, OdbcConnection targetConn, string targetTable)
{
OdbcTransaction tran = null;
string[] selectStatement = new string[sourceTable.Rows.Count];
// Check if targetTable exists, create it if it doesn't
if (!TableExists(targetConn, targetTable))
{
bool created = CreateTableFromDataTable(targetConn, sourceTable);
if (!created)
return false;
}
try
{
// Prepare insert statement based on sourceTable
string insertStatement = string.Format("INSERT INTO [dbo].[{0}] (", targetTable);
foreach (DataColumn dataColumn in sourceTable.Columns)
{
insertStatement += dataColumn + ",";
}
insertStatement += insertStatement.TrimEnd(',') + ") ";
// Open connection to target db
using (targetConn)
{
if (targetConn.State != ConnectionState.Open)
targetConn.Open();
tran = targetConn.BeginTransaction();
for (int i = 0; i < sourceTable.Rows.Count; i++)
{
DataRow row = sourceTable.Rows[i];
// Need to iterate through columns in row, getting values and data types and building a SELECT statement
selectStatement[i] = "SELECT ";
}
insertStatement += string.Join(" UNION ", selectStatement);
using (OdbcCommand cmd = new OdbcCommand(insertStatement, targetConn, tran))
{
cmd.ExecuteNonQuery();
}
tran.Commit();
return true;
}
}
catch
{
tran.Rollback();
return false;
}
}
任何建议将不胜感激。此外,如果有一种比我建议的更简单的方法,那么任何细节都会很棒。