【发布时间】:2014-10-28 14:13:30
【问题描述】:
我正在尝试通过我的 Windows 窗体应用程序(使用 C# 构建)在数据库的表中添加一个新列。
我创建了一个方法CreateFieldNameInTableData(string FieldName, string TableName),它传递变量'FieldName'的名称,这是要添加到表中的列的名称,'TableName',可以指定由用户。
此方法尝试将列添加到表中的代码如下:
private void CreateFieldNameInTableData(string FieldName, string AssetTypeCode)
{
SqlConnection conn = new SqlConnection(SQLConnectionString);
SqlCommand comm = null;
try
{
try
{
comm = conn.CreateCommand();
comm.CommandText = "ALTER TABLE [AS_" + TableName + "_DATA] ADD " + FieldName + " VARCHAR(30)";
comm.CommandType = CommandType.Text;
comm.CommandTimeout = 30; //30 seconds
conn.Open();
}
catch (SqlException err)
{
MessageBox.Show("SqlException Error : " + err.Message.ToString());
}
}
catch (Exception ex)
{
MessageBox.Show("Exception Error : " + ex.Message.ToString());
}
finally
{
conn.Close();
}
}
当我在 Server Management Studio 中使用相同的 SQL 脚本时,它成功地在表 AS_TableName_DATA 中创建列,但是当我尝试使用 C# 执行相同操作时,它没有抛出任何错误,但经过检查,表没有要创建的新列。
任何帮助...出了什么问题?
附:我还检查了 SQLConnectionString,它也连接到正确的数据库。
【问题讨论】:
-
你没有执行你的命令。在
try块的末尾添加cmd.ExecuteNonQuery(); -
在您的查询中也使用
QUOTENAME请参阅:此帖子:stackoverflow.com/questions/20719449/… -
@Habib 你不能参数化 DML
-
@FilipDeVos,是的,DML 的参数化术语是错误的,我的意思是使用 QUOTENAME 或 SqlCommandBuilder.QuoteIdentifie 方法
-
正确,需要
comm.ExecuteNonQuery。此外,您可以通过 (A) 只有一个try块,但随后有 2 个catches 来重构/简化您的代码。一个用于SqlException,另一个用于Exception。喜欢这里的ThrowTest3- msdn.microsoft.com/en-us/library/0yd65esw.aspx。您将拥有更少的嵌套代码。另一个 (B) - 30 是默认超时,您可以跳过该行comm.CommandTimeout = 30。
标签: c# .net sql-server tsql windows-forms-designer