【问题标题】:What is the difference between those two SQL command parameter declaration methods? [duplicate]这两种 SQL 命令参数声明方法有什么区别? [复制]
【发布时间】:2016-06-10 00:08:06
【问题描述】:

我是 SQL 新手,我正在使用 Windows 窗体和 C#。

以下 2 个 SQL 查询工作正常,没有问题,但我担心其中一个可能会在以后引起问题,我不知道哪个更安全。

我只是想知道第一种和第二种方法中两个命令参数减速和赋值有什么区别:

第一个命令参数减速方法:

SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);

SqlCommand MyCommand = new SqlCommand();
DataTable DataTable = new DataTable();

SqlDataAdapter Sql_Data_Adapter = new SqlDataAdapter();

long PhoneNumber = 07429114523;

MyConnection.Open();
MyCommand.CommandText = "SELECT * FROM List_of_All_Orders WHERE Phone= @PhoneNumber ";
MyCommand.Connection = MyConnection;

// command parameters declaration and value assigning
MyCommand.Parameters.Add("@PhoneNumber", SqlDbType.BigInt).Value = PhoneNumber;

Sql_Data_Adapter.SelectCommand = MyCommand;
Sql_Data_Adapter.Fill(DataTable);

dataGridView1.DataSource = DataTable;            
MyCommand.Parameters.Clear();
MyConnection.Close();

第二个命令参数声明方法:

long PhoneNumber = 07429114523;
MyConnection.Open();
MyCommand.CommandText = "SELECT * FROM List_of_All_Orders WHERE Phone= @PhoneNumber ";
MyCommand.Connection = MyConnection;

// command parameters declaration and value assigning
MyCommand.Parameters.Add("@PhoneNumber", SqlDbType.BigInt);
MyCommand.Parameters["@PhoneNumber"].Value = PhoneNumber;

Sql_Data_Adapter.SelectCommand = MyCommand;
Sql_Data_Adapter.Fill(DataTable);

dataGridView1.DataSource = DataTable;

MyCommand.Parameters.Clear();
MyConnection.Close();

任何人都知道在命令参数声明和赋值方面选择第一种或第二种方法,哪种方法更安全。

请帮忙。谢谢

【问题讨论】:

  • 它们是一样的,只是后者更冗长。请注意,电话号码是字符串,而不是整数,因此您将丢失前导 0。通过使用 using () {} 连接和命令和适配器,省去稍后调用 .Dispose 的麻烦。
  • @Alex K. 我使用 PhoneNumber = Convert.ToInt64(textBox1.Text);因为电话号码不适合 "int32" 。所以我必须使用 "long" 。除了“long”之外还有其他数据类型可以携带11位数字吗?谢谢
  • 是的,C# 中的字符串和 SQL 中的 VARCHAR(32),如果要保留前导零,则必须使用字符串。
  • @AlexK。 OP 可能没有处理以 0 开头的电话号码。
  • 好吧; long PhoneNumber = 07429114523;

标签: c# sql sql-server


【解决方案1】:
  MyCommand.Parameters.Add("@PhoneNumber", SqlDbType.BigInt).Value = PhoneNumber;

单行版本更好,因为

  • 一切都在一行中完成,
  • 没有在第二行拼错参数名称的风险,

但仍有很多问题需要解决。
我会做一个小函数来为你做这一切,并防止常见的错误:

   // Returns a new BigInt parameter
   public SqlParameter ParamBigInt(string paramName, long v)
   {
       // Fixup parameter name
       string name = paramName.Trim();

       if (!name.StartsWith("@"))
           name = "@" + name;

       // Make the new parameter
       return new SqlParameter(name, SqlDbType.BigInt)
       {
           Value = p;
       };
   }

然后使用它:

  MyCommand.Parameters.Add(ParamBigInt("@PhoneNumber", PhoneNumber));

【讨论】:

    【解决方案2】:

    以上两种方法都没有问题。事实上,有一种更短的语法,您无需担心数据类型。

    MyCommand.Parameters.Add("@PhoneNumber", PhoneNumber);
    

    假设您有 20 个要添加的参数,您会更喜欢能加快项目完成时间的参数

    【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2016-05-08
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多