0

我刚开始使用 SQL Server 2008。我有一个 winforms 应用程序,它必须将应用程序中的数据插入数据库,并且一些文本框值可能为空。在谷歌搜索后,我发现了一些东西,但我会解释一下。

我发现此代码将记录插入数据库(不包括连接代码)

stringInsert += "INSERT INTO MyDatabase(dateTime, Name, Surname)";
stringInsert += "VALUES(@Date, @NameString, @SurnameString)";

SqlCommand cmd = new SqlCommand(stringInsert, con);

cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@Date", strTime));
cmd.Parameters.Add(new SqlParameter("@Name", StringName));
cmd.Parameters.Add(new SqlParameter("@Surname", StringSurname));

if (string.IsNullOrEmpty(StringName))
   cmd.Parameters.Add(new SqlParameter("@Name", DBNull.Value.ToString()));
else
   cmd.Parameters.Add(new SqlParameter("@Name", StringName));

但是其他人写了该方法cmd.Parameters.AddWithValue("@Name" , StringName);

自动执行 if else 因为 ifStringName为 null 或为空它设置DBNull.Value

现在我的问题是:

  1. 我不明白如何cmd.Parameters.Add(new SqlParameter("@Name", StringName));将 stringInsert 修改为 StringName。“@Name”只是字符串的一部分,所以符号“@”可能会做一些我不知道的事情?通常,当我需要以这种方式排除转义时,我会使用 @ 符号 @"c:\home"

  2. cmd.Parameters.AddWithValue("@Name" , StringName);即使StringName为空或为空,它是否正确使用?

  3. 这是在 WinForm 应用程序中使用许多文本框将数据提交到 SQL Server DB 的正确方法吗?

谢谢

4

1 回答 1

2

1) @Name 是一个占位符。您要求 NET 引擎将 @Name 占位符替换为相同命名参数的值。(这对于不支持命名参数的 ADO NET 提供程序是不同的)
2)当您想在数据库中插入 NULL 时,您应该使用 DBNull.Value,所以您的代码应该是cmd.Parameters.AddWithValue("@Name" , string.IsNullOrEmpty(StringName) ? DBNull.Value : StringName);
3)是的,这是正确的方法去。始终使用参数化查询。和using声明`

于 2012-06-24T16:01:32.307 回答