【发布时间】: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