在添加或更新表记录之前,我试图删除所有表中存在的列。由于Azure的某些功能以及在移动设备上同步表的缘故,这是必需的。在下面的示例中,我删除了名为“ Col4”的文件。
到目前为止,以下是我最好的方法。在使用SqlCommandBuilder
清除SQL命令后,它将执行简单的字符串替换(请参见代码下方的此清除SQL的示例)。用字符串替换删除该列后,然后替换SqlCommandBuilder
中的命令文本。我希望使用字符串生成器作为删除列的方法,因为与commandText
参数相比,格式应该保持一致,后者可能会有很大差异。但是我担心这种方法会遇到很多问题,例如我可能还需要修改更新的SQL命令中的VALUES部分,但这可能很困难,因为我要处理具有不同列数的不同表。如您所见,无论如何,我在代码中指出的地方出现错误。
有没有一种简单的方法可以删除da.InsertCommand = \ command之前没有指定值的列
public bool UpdateTest(DataTable dt, string commandText)
{
bool success = false;
SqlDataAdapter da = null;
SqlCommand command = null;
SqlCommandBuilder cb = null;
try
{
lock ((_Lock))
{
using (SqlConnection connX = new SqlConnection(_ConnectionString))
{
connX.Open();
command = new SqlCommand();
command.CommandType = CommandType.Text;
command.CommandText = commandText;
command.Connection = connX;
da = new SqlDataAdapter();
da.SelectCommand = command;
// This section is where I try to remove the column
SqlCommandBuilder testcb = new SqlCommandBuilder(da);
string testSQL = testcb.GetInsertCommand.CommandText;
testSQL = testSQL.Replace(", [Col4]", string.Empty);
da.SelectCommand.CommandText = testSQL;
cb = new SqlCommandBuilder(da);
da.InsertCommand = cb.GetInsertCommand; //Code fails here--not surprising
da.DeleteCommand = cb.GetDeleteCommand;
da.UpdateCommand = cb.GetUpdateCommand;
da.Update(dt.GetChanges);
success = true;
}
}
}
catch (Exception ex)
{
}
finally
{
dt = null;
if (!command == null)
{
command.Dispose();
command = null;
}
if (!(da == null))
{
da.Dispose();
da = null;
}
}
return success;
}
原始da.SelectCommand.CommandText
:
"INSERT INTO [Table] ([Col1], [Col2], [Col3], [Col4]) VALUES (@p1, @p2, @p3, @p4)"
更新了da.SelectCommand.CommandText
:
"INSERT INTO [Table] ([Col1], [Col2], [Col3]) VALUES (@p1, @p2, @p3, @p4)"