2011-08-01 45 views
6

Tôi muốn tạo một số câu lệnh SQL dựa trên danh sách cột sử dụng tên cột làm tham số.Nhận tiền tố tham số trong ADO.NET

Sửa: C#

var columns = new string[] { "COL1", "COL2" }; 
var tableName = "TABLE_1"; 
var prefix = "@"; // TODO get this from the provider factory 

string sqlInsert = string.Format(
    "INSERT INTO {0}\n({1}) VALUES\n({2})", 
    tableName, 
    string.Join(", ", columns), 
    string.Join(", ", columns.Select(c => prefix + c))); 

tạo SQL:

INSERT INTO TABLE_1 
(COL1, COL2) VALUES 
(@COL1, @COL2) 

này làm việc với các SqlClient. Nhưng tôi đang sử dụng các lớp trừu tượng trong System.Data (DbCommand, DbParameter, v.v.) và các nhà cung cấp dữ liệu khác nhau như Oracle, MySQL, Postgres, vv dựa trên các cài đặt chuỗi kết nối trong app.config. Vì vậy, tôi cần phải biết tôi phải sử dụng tiền tố nào. Đối với MS-SQL, nó là @, Oracle sử dụng :, phần còn lại tôi thực sự không biết.

Có cách nào để nhận ký tự tiền tố này từ nhà máy của nhà cung cấp không?

System.Data.SqlClient.SqlClientFactory.Instance không có thông tin như vậy hoặc ít nhất tôi không thể tìm thấy thông tin đó.

Nếu không, bạn có thể cho tôi danh sách các cơ sở dữ liệu chung không?

Chỉnh sửa: Nền tảng đích là .NET 2 đến .NET 4 và thông tin sẽ có sẵn thông qua nhà máy của nhà cung cấp.

+0

Bạn có thể cung cấp mã bạn đã sử dụng để tạo SQL không? – mellamokb

Trả lời

1

Tôi tìm thấy câu trả lời, nhưng tôi không thể tái tạo như thế nào tôi tìm thấy nó:

http://www.codewrecks.com/blog/index.php/2007/09/06/about-parametermarkerformat/

DbConnection có thể cung cấp bảng lược đồ cũng chứa các chuỗi định dạng chính xác để tạo tên thông số lệnh, ngoại trừ SqlClient !!

DbProviderFactory myFactory = DbProviderFactories.GetFactory(myProviderName); 

using (DbConnection myConnection = myFactory.CreateConnection()) 
{ 
    myConnection.ConnectionString = mySettings.ConnectionString; 
    myConnection.Open(); 

    string parameterMarker = myConnection 
     .GetSchema(DbMetaDataCollectionNames.DataSourceInformation) 
     .Rows[0][DbMetaDataColumnNames.ParameterMarkerFormat].ToString(); 

    myConnection.Close(); 
} 

Đối SqlCclientparameterMarker{0} nhưng phải @{0}. Tôi sẽ điều tra thêm một chút để tìm hiểu những gì được chứa trong các cột trong bảng lược đồ khác.

+0

'ParameterMarkerPattern' là' {0} 'vì' @ 'đã được bao gồm trong' ParameterNamePattern', vì vậy bạn nên kiểm tra cả hai. –

Các vấn đề liên quan