2016-02-26 74 views
0

我是SQL新手,我正在使用Windows窗體和C#。這兩個SQL命令參數聲明方法有什麼區別?

以下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(); 

任何人都知道在命令參數中選擇第一或第二種方法聲明和價值分配,哪一個更安全。

請幫忙。謝謝

+2

他們是一樣的,後者只是更詳細。請注意,電話號碼是字符串,而不是整數,因此您將丟失前導0.保存稍後使用'using(){}'調用連接和命令和適配器調用'.Dispose'的麻煩。 –

+0

@Alex K.我使用PhoneNumber = Convert.ToInt64(textBox1.Text);因爲電話號碼不適合「int32」。所以我必須使用「長」。除「long」之外還有其他數據類型可以攜帶11位數字嗎?謝謝 – Kate

+0

是的,C#中的字符串和SQL中的VARCHAR(32),如果要保留前導零,則必須使用字符串。 –

回答

-2

上述兩種方法都沒有問題。事實上,在不需要擔心數據類型的情況下,語法較短。

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

假設你有20個參數,你想加入,你會喜歡的東西,會加速項目的完成時間

+0

如果你正在打分,至少要說明原因 –

+0

'Add'的超載已被標記爲廢棄。你可能意思是'AddWithValue',但也有理由不要使用它。http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/ – juharr

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));