2009-12-02 10 views
5

Vì vậy, đây là thỏa thuận. Trong cơ sở dữ liệu của chúng tôi, chúng tôi bọc hầu hết các lần đọc của chúng tôi (tức là các câu lệnh chọn) trong các hàm có giá trị bảng cho mục đích bảo mật và mô đun. Vì vậy, tôi đã có một TVF xác định một hoặc nhiều tham số tùy chọn.Cách chuyển từ khóa mặc định cho bảng có giá trị gọi hàm trong ADO.NET

Tôi tin rằng có một TVF với các thông số defaulted uỷ quyền sử dụng của từ khóa default khi gọi TVF như vậy:

select * from fn_SampleTVF(123, DEFAULT, DEFAULT) 

Đó là tốt, mọi thứ hoạt động trong phân tích truy vấn, nhưng khi nói đến thời gian để thực sự thực hiện yêu cầu này từ ADO.NET, tôi không chắc chắn làm thế nào để tạo ra một tham số sql mà thực sự đặt từ default vào sql trả về.

Tôi có một cái gì đó gần như thế này bây giờ:

String qry = "select * from fn_SampleTVF(@requiredParam, @optionalParam)"; 

DbCommand command = this.CreateStoreCommand(qry, CommandType.Text); 

SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
someRequiredParam.Value = 123; 
command.Parameters.Add(someRequiredParam); 

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

Vì vậy, bất cứ ai có bất kỳ ý tưởng làm thế nào để vượt qua default đến TVF?

+1

giải pháp tốt nhất mà tôi đã nhìn thấy cái xa là để tránh sử dụng các điều khoản mặc định trong định nghĩa tham số TVF, chuyển vào các giá trị rỗng như Kevin đề xuất và tạo các giá trị mặc định theo cách thủ công trong cơ thể TVF của bạn. Đây là một bài báo tôi tìm thấy (nó về Sprocs, nhưng vấn đề là như nhau). http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/3825fe1c-7b7e-4642-826b-ea024804f807 Như với tất cả những thứ khác liên quan đến Microsoft, việc này hoạt động sẽ liên quan đến một nửa giải pháp thay thế. – Mason

Trả lời

0

Bạn có thể chuyển Null làm giá trị tham số.

Bài viết này cho ví dụ: http://support.microsoft.com/kb/321902

+0

Cảm ơn tôi sẽ thử điều đó, nhưng tôi khá chắc chắn rằng việc chuyển một null rõ ràng sẽ chỉ ghi đè lên các giá trị mặc định được định nghĩa trong định nghĩa tvf, làm cho các giá trị mặc định vô ích. – Mason

+0

Tôi rất muốn nghe những phát hiện của bạn. Tôi ngạc nhiên rằng tôi chưa bao giờ cần phải biết điều này trước khi nhìn thấy câu hỏi của bạn. Tôi vẫn mong đợi Null làm việc và DBNull sẽ ghi đè định nghĩa của người bán hàng. –

+0

Vâng, tôi đã kiểm tra, điều đó không tốt. Và lý do là vì có sự khác biệt giữa: select * from fn_SampleTVF (123, DEFAULT) và select * from fn_SampleTVF (123, null) Cảm ơn mặc dù. – Mason

3
SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

Bạn không cần phải thêm mã ở trên (Tham số tùy chọn) cho mặc định. SQL Server sẽ sử dụng mặc định như được định nghĩa trong UDF của bạn. Tuy nhiên nếu bạn muốn vượt qua giá trị khác nhau thì bạn có thể vượt qua:

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = newValue; 
command.Parameters.Add(optionalParam); 
+0

Ngoài ra, có vẻ như (từ thử nghiệm của tôi cho đến nay) bạn thậm chí không phải chỉ định datatype; để bạn có thể nói: command.Parameters.Add (new SqlParameter ("@ OptionalParam", null)); ...và [null] sẽ được hiểu là [mặc định] – tbone

+1

CHỈNH SỬA: nhận xét trước của tôi không đúng: [null] là ** không ** được hiểu là [mặc định] – tbone

+0

Ok, sau khi thử nghiệm nhiều hơn, ít nhất với phiên bản khung hiện tại Tôi đang sử dụng, thêm tham số mà không chỉ định một giá trị KHÔNG dẫn đến giá trị mặc định đang được sử dụng. Gọi từ SSMS với [mặc định] không mang lại kết quả tương tự như truyền tham số không có giá trị, mặc dù đó là hành vi ngụ ý ở đây: https://msdn.microsoft.com/en-us/library/system.data. sqlclient.sqlparameter.value% 28v = vs.110% 29.aspx – tbone

1

tôi sẽ làm như vậy:

public void YourMethod(int rparam, int? oparam = null) 
{ 
    String qry = string.Format("select * from fn_SampleTVF(@requiredParam, {0})" 
     , !oparam.HasValue ? "default" : "@optionalParam"); 

    SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
    someRequiredParam.Value = rparam; 
    command.Parameters.Add(someRequiredParam); 

    if (oparam.HasValue) 
    { 
     SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
     optionalParam.Value = oparam.Value; 
     command.Parameters.Add(optionalParam); 
    } 
}