2012-03-01 27 views
7

Tôi đang điền bảng bằng cách sử dụng một thủ tục được lưu trữ. Bảng cho phép một 'null' cho tên đệm ban đầu của tên, nhưng tôi nhận được thông báo lỗi sau:C# ASP.Net Parameters.AddWithValue từ chối giá trị null cho tham số

Thủ tục hoặc hàm 'uspInsertPersonalAccountApplication' hy vọng tham số '@MiddleInitial', không được cung cấp.

Cảm ơn trước!

public void ProcessForm(string[] InputData) 
    { 
     string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["AssociatedBankConnectionString"].ToString(); 

     SqlConnection conn = new SqlConnection(ConnString); 
     SqlCommand cmd = new SqlCommand("uspInsertPersonalAccountApplication", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@AccountType", "Savings"); 
     cmd.Parameters.AddWithValue("@AccountSubType", "Savings"); 
     cmd.Parameters.AddWithValue("@ExistingCustomer","No"); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 

Trả lời

4

Có hai lựa chọn ở đây:

Modify bạn thủ tục lưu trữ và làm @MiddleInitial param tùy chọn (mà hiện nay không phải là bắt buộc đó là lý do tại sao lỗi được đưa ra)

@MiddleInitial nvarchar(10) = NULL 

Hoặc thêm sau dòng mã của bạn:

cmd.Parameters.AddWithValue("@MiddleInitial", null); 
+1

Tôi chuyển qua 53 tham số, nhiều tham số có thể là rỗng. Làm thế nào tôi có thể tự động đặt DBNull.Value mà không cần gói mỗi phép gán trong câu lệnh IF? – Susan

+1

Nếu có thể sửa đổi thủ tục được lưu trữ, sau đó sửa đổi paramateres có thể là null, và làm cho chúng tùy chọn trong khai báo thủ tục lưu trữ. Đó là giải pháp linh hoạt nhất.Nếu điều này là không thể, bạn có thể sử dụng 'SqlCommandBuilder.DeriveParameters (lệnh);' và đặt 'DBNull.Value' cho mỗi người trong vòng lặp. Và sau đó gán những cái bạn muốn. – Marcin

+2

Xem nhận xét cho http://stackoverflow.com/a/9518215/8479: sử dụng 'cmd.ParametersAddWithValue (" @ MiddleInitial ", (đối tượng) yourVal ?? DBNull.Value);' hoặc thêm một phương thức mở rộng như 'AddParamWithValueOrNull () ' – Rory

3

Cố gắng vượt qua trong DBNull.Value thay vì null.

+0

Tôi chuyển qua 53 tham số, nhiều tham số có thể là rỗng. Làm thế nào tôi có thể tự động đặt DBNull.Value mà không cần gói mỗi phép gán trong câu lệnh IF? – Susan

+1

Thêm '?? DBNull.Value' sau khi giá trị, hoặc tạo ra một chức năng như 'AddValueWithNonNullParameter' mà nó cho bạn – Andomar

+0

Như thế này? Intellisense đang cho tôi một lỗi và Intellisense không nhận ra AddValueWithNullParameter ------- cmd.Parameters.AddWithValue ("@ MiddleInitial", InputData [11] ?? DBNull.Value); – Susan

0

thêm tham số cho MiddleInitial cũng có giá trị Null

public void ProcessForm(string[] InputData) 
    { 
     string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["AssociatedBankConnectionString"].ToString(); 

     SqlConnection conn = new SqlConnection(ConnString); 
     SqlCommand cmd = new SqlCommand("uspInsertPersonalAccountApplication", conn); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@AccountType", "Savings"); 
     cmd.Parameters.AddWithValue("@AccountSubType", "Savings"); 
     cmd.Parameters.AddWithValue("@ExistingCustomer","No"); 
     cmd.Parameters.AddWithValue("@MiddleInitial",DBNull.Value); 
     conn.Open(); 
     cmd.ExecuteNonQuery(); 

     conn.Close(); 
    } 
1

Bạn cần phải tuyên bố trên tất cả mọi thứ - thậm chí nếu nó là null.

Sử dụng DBNull.Value cho MiddleInitial.

cmd.Parameters.AddWithValue("@MiddleInitial",DBNull.Value); 
0

hey bạn phải thiết lập với thủ tục lưu trữ

@MiddleInitial varhcar(8) = null 
+0

+1 Điều này thực sự sẽ hoạt động vì tham số trở thành tùy chọn – Andomar

5

Bạn có thể thêm vào dự án và sử dụng phương pháp mở rộng sau:

public static SqlParameter AddWithValueSafe(this SqlParameterCollection parameters, string parameterName, object value) 
{ 
    return parameters.AddWithValue(parameterName, value ?? DBNull.Value); 
} 
1

Tôi tạo ra một phương pháp khuyến nông để chiến đấu vấn đề này. Đề xuất của Marcin cũng đáng xem xét nếu bạn có thể cập nhật thủ tục được lưu trữ.

cmd.Parameters.AddString("@MyParamName", myValue); 


public static class SQLExtension 
{ 
    public static void AddString(this SqlParameterCollection collection, string parameterName, string value) 
    { 
     collection.AddWithValue(parameterName, ((object)value) ?? DBNull.Value); 
    } 
} 
Các vấn đề liên quan