在使用 SQL Server 2000 進行參數化 SQL 操作時,開發人員常會遇到一個詭異的現象:同一段數據庫操作代碼,在不同機器上卻表現出截然不同的行為。具體表現為:調用同一個數據庫操作函數時,傳遞參數名稱是否帶「@」符號,竟然導致其中一台機器報錯「必須聲明變量 @paraName」,而另一台機器卻運行正常。
問題的核心在於這個通用的數據庫操作函數 ExecuteSqlInsertLongSql:
public static int ExecuteSqlInsertLongSql(string strSQL, string textValue, string strParaName)
{
string strConn = System.Configuration.ConfigurationSettings.AppSettings["sqlserver"];
using (SqlConnection connection = new SqlConnection(strConn))
{
SqlCommand cmd = new SqlCommand(strSQL, connection);
string paraName = strParaName; // 直接使用傳入的參數名
SqlParameter Sqlpara = new SqlParameter();
Sqlpara.ParameterName = paraName;
Sqlpara.SqlDbType = SqlDbType.Text;
Sqlpara.Size = textValue.Length + 1;
Sqlpara.Value = textValue;
cmd.Parameters.Add(Sqlpara);
// ... 後續執行邏輯
}
}
方法一(帶 @ 符號):
sql = "INSERT INTO wjb(...) VALUES(..., @paraName, ...)";
conn.ExecuteSqlInsertLongSql(sql, strHtmlValue, "@paraName");
方法二(不帶 @ 符號):
sql = "INSERT INTO wjb(...) VALUES(..., @paraName, ...)";
conn.ExecuteSqlInsertLongSql(sql, strHtmlValue, "paraName");
這並非數據庫設置差異,而是 SqlParameter.ParameterName 屬性的賦值規則 決定的:
@paraName)SqlParameter.ParameterName 屬性可以帶或不帶「@」,SQL Server 客戶端驅動會自動處理真正的關鍵在於:SQL 字符串中的參數名必須與 SqlParameter.ParameterName 邏輯一致。當 SQL 文本寫成 @paraName 時,無論傳入參數名是 "@paraName" 還是 "paraName",驅動程序內部都會正確映射。
這通常是因為:
統一規範:
@paraNamepara.ParameterName = "@paraName"ExecuteSqlInsertLongSql(sql, value, "@paraName")這樣可消除歧義,確保跨環境、跨版本的一致性行為。
無論參數名寫法如何,參數化查詢始終提供: