下面是我用来批量更新(大约 14k 条记录)我们的ZipCodeTerritory
表的代码。代码运行良好,没有任何异常,但是当我在connection
关闭后检查表时,我发现没有进行任何更改。
List
我在方法之间传递的对象中保存了所有需要更新的记录。我使用它List
来填充DataTable
并将其放入 aDataSet
以执行更新。
这是我第一次尝试使用这种技术,因此非常感谢任何建议。
private static string selectCommand =
"SELECT ChannelCode, DrmTerrDesc, IndDistrnId, StateCode, ZipCode, EndDate,
EffectiveDate, LastUpdateId, LastUpdateDate, Id, ErrorCodes, Status FROM
ZipCodeTerritory";
private static string updateCommand = "UPDATE ZipCodeTerritory SET ChannelCode =
@ChannelCode, DrmTerrDesc = @DrmTerrDesc,
IndDistrnId = @IndDistrnId," +
"StateCode = @StateCode, ZipCode = @ZipCode,
EndDate = @EndDate, EffectiveDate =
@EffectiveDate," +
"LastUpdateId = @LastUpdateId, LastUpdateDate
= @LastUpdateDate, ErrorCodes = @ErrorCodes,"
+ "Status = @Status " +
"WHERE Id = @Id";
public static void Update(List<ZipCodeTerritory> updates, Dictionary<ZipCodeTerritory, string> errorList)
{
using (SqlConnection connection = new SqlConnection(connString))
{
using (SqlDataAdapter adapter = new SqlDataAdapter(selectCommand, connection))
{
try
{
SqlCommand updateCmd = connection.CreateCommand();
updateCmd.CommandText = updateCommand;
updateCmd.Parameters.Add(new SqlParameter("@ChannelCode", SqlDbType.Char, 1, "ChannelCode"));
updateCmd.Parameters.Add(new SqlParameter("@DrmTerrDesc", SqlDbType.Char, 1, "DrmTerrDesc"));
updateCmd.Parameters.Add(new SqlParameter("@IndDistrnId", SqlDbType.Char, 1, "IndistrnId"));
updateCmd.Parameters.Add(new SqlParameter("@StateCode", SqlDbType.Char, 1, "StateCode"));
updateCmd.Parameters.Add(new SqlParameter("@ZipCode", SqlDbType.Char, 1, "ZipCode"));
updateCmd.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.Char, 1, "EndDate"));
updateCmd.Parameters.Add(new SqlParameter("@EffectiveDate", SqlDbType.Char, 1, "EffectiveDate"));
updateCmd.Parameters.Add(new SqlParameter("@LastUpdateId", SqlDbType.Char, 1, "LastUpdateId"));
updateCmd.Parameters.Add(new SqlParameter("@LastUpdateDate", SqlDbType.Char, 1, "LastUpdateDate"));
updateCmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Char, 1, "Id"));
updateCmd.Parameters.Add(new SqlParameter("@ErrorCodes", SqlDbType.Char, 1, "ErrorCodes"));
updateCmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.Char, 1, "Status"));
updateCmd.UpdatedRowSource = UpdateRowSource.None;
adapter.UpdateCommand = updateCmd;
adapter.AcceptChangesDuringUpdate = true;
DataSet ds = LoadDataSet(updates);
connection.Open();
adapter.Fill(ds, "ZipCodeTerritory");
adapter.Update(ds, "ZipCodeTerritory");
connection.Close();
}
catch (Exception ex)
{
string msg = ex.Message;
}
}
}
}
private static DataSet LoadDataSet(List<ZipCodeTerritory> zipcodeList)
{
DataSet ds = new DataSet();
DataTable data = LoadData(zipcodeList);
ds.Tables.Add(data);
return ds;
}
private static DataTable LoadData(List<ZipCodeTerritory>zipCodeList)
{
DataTable dataTable = InitializeStructure();
foreach (var zipcode in zipCodeList)
{
DataRow row = dataTable.NewRow();
try
{
row[0] = zipcode.ChannelCode.Trim();
row[1] = zipcode.DrmTerrDesc.Trim();
row[2] = zipcode.IndDistrnId.Trim();
row[3] = zipcode.StateCode.Trim();
row[4] = zipcode.ZipCode.Trim();
row[5] = zipcode.EndDate.Date;
row[6] = zipcode.EffectiveDate.Date;
row[7] = zipcode.LastUpdateId;
row[8] = DateTime.Now.Date;
//row[9] = zipcode.Id;
row[10] = zipcode.ErrorCodes;
row[11] = zipcode.Status;
}
catch (Exception ex)
{
}
dataTable.Rows.Add(row);
}
return dataTable;
}
private static DataTable InitializeStructure()
{
DataTable dt = new DataTable();
dt.Columns.Add("ChannelCode", typeof (string));
dt.Columns.Add("DrmTerrDesc", typeof (string));
dt.Columns.Add("IndDistrnId", typeof (string));
dt.Columns.Add("StateCode", typeof (string));
dt.Columns.Add("ZipCode", typeof (string));
dt.Columns.Add("EndDate", typeof (DateTime));
dt.Columns.Add("EffectiveDate", typeof (DateTime));
dt.Columns.Add("LastUpdateId", typeof (string));
dt.Columns.Add("LastUpdateDate", typeof (DateTime));
dt.Columns.Add("Id", typeof (int));
dt.Columns.Add("ErrorCodes", typeof (string));
dt.Columns.Add("Status", typeof (string));
return dt;
}
编辑
我已经更改了.Fill
和LoadDataSet()
方法的顺序,以首先从当前所在的数据库中加载数据,然后将更改合并到DataSet
. 但是,我现在收到以下错误:
`Update unable to find TableMapping['ZipCodeTerritory'] or DataTable 'ZipCodeTerritory'`
我意识到我没有命名表,所以我将InitializeStructure()
方法更改为以下
private static DataTable InitializeStructure()
{
DataTable dt = new DataTable("ZipCodeTerritory");
但是....现在当我尝试.Update
在这条线上
adapter.Update(ds, "ZipCodeTerritory");
我得到这个例外:
Update requires a valid InsertCommand when passed DataRow collection with new rows.
第二次编辑
我在方法中添加了以下内容InsertCommand
(Update
这是包含 的前几行代码try
)updateCommand
:
SqlCommand insertCmd = new SqlCommand(insertCommand, connection);
insertCmd.CommandText = updateCommand;
insertCmd.Parameters.Add(new SqlParameter("@ChannelCode", SqlDbType.Char, 1, "ChannelCode"));
insertCmd.Parameters.Add(new SqlParameter("@DrmTerrDesc", SqlDbType.NVarChar, 30, "DrmTerrDesc"));
insertCmd.Parameters.Add(new SqlParameter("@IndDistrnId", SqlDbType.Char, 3, "IndDistrnId"));
insertCmd.Parameters.Add(new SqlParameter("@StateCode", SqlDbType.Char, 3, "StateCode"));
insertCmd.Parameters.Add(new SqlParameter("@ZipCode", SqlDbType.Char, 9, "ZipCode"));
insertCmd.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.Date, 10, "EndDate"));
insertCmd.Parameters.Add(new SqlParameter("@EffectiveDate", SqlDbType.Date, 10, "EffectiveDate"));
insertCmd.Parameters.Add(new SqlParameter("@LastUpdateId", SqlDbType.Char, 8, "LastUpdateId"));
insertCmd.Parameters.Add(new SqlParameter("@LastUpdateDate", SqlDbType.Date, 10, "LastUpdateDate"));
insertCmd.Parameters.Add(new SqlParameter("@Id", SqlDbType.Int, 20, "Id"));
insertCmd.Parameters.Add(new SqlParameter("@ErrorCodes", SqlDbType.VarChar, 255, "ErrorCodes"));
insertCmd.Parameters.Add(new SqlParameter("@Status", SqlDbType.Char, 1, "Status"));
adapter.InsertCommand = insertCmd;
但是我仍然没有看到数据库中有任何变化。