Tôi có ứng dụng ADO.NET độc lập kết nối với một số cơ sở dữ liệu và có thể trích xuất thông tin cần thiết để chạy. Tôi đã nhấn một snag với DB2 và cách nó xử lý các tham số có tên, đặc biệt khi tôi sử dụng lại một tham số có tên trong cùng một truy vấn. Tôi biết một vài cách để giải quyết vấn đề này bằng cách thêm nhiều tham số hơn, nhưng về mặt lý thuyết nó sẽ hoạt động như trên các cơ sở dữ liệu khác mà tôi kết nối với tên tham số giống nhau.C# ADO.NET IBM DB2 đặt tên tham số có cùng tên ném Không đủ thông số được chỉ định Ngoại lệ
Những gì tôi đang làm là một chút phức tạp hơn và liên quan đến truy vấn con vv, nhưng để chứng minh, đi truy vấn sau đây:
chọn giá trị từ test.table nơi cola = @ key1 và colb = @ key1;
Tham số được đặt tên @ key1 được sử dụng hai lần.
Mã của tôi là như sau:
try
{
DbProviderFactory dbfFactory = DbProviderFactories.GetFactory("IBM.Data.DB2.iSeries");
using (DbConnection dbConnection = dbfFactory.CreateConnection())
{
dbConnection.ConnectionString = "DataSource=xxx.xxx.xxx.xxx;UserID=xxxxxxxx;password=xxxxxxxxx";
using (DbCommand dbCommand = dbConnection.CreateCommand())
{
IDbDataParameter iddpParameter1 = dbCommand.CreateParameter();
iddpParameter1.ParameterName = "@key1";
iddpParameter1.DbType = DbType.String;
iddpParameter1.Value = "1";
dbCommand.Parameters.Add(iddpParameter1);
dbCommand.CommandType = CommandType.Text;
dbCommand.CommandText = "select value from test.table where [email protected] and [email protected]";
dbConnection.Open();
using (IDataReader idrReader = dbCommand.ExecuteReader())
{
while (idrReader.Read())
{
...
}
}
}
} // end dbConnection
} // end try
catch (Exception ex)
{
Console.Write(ex.Message);
}
Khi tôi chạy này tôi nhận được một ngoại lệ mà nói với tôi:
System.InvalidOperationException: Not enough parameters specified. The command requires 2 parameter(s), but only 1 parameter(s) exist in the parameter collection.
tôi nhận được những gì nó đang nói với tôi, nhưng tôi đang tìm giúp đỡ trong việc tìm ra cách tôi có thể có nhà cung cấp sử dụng tham số được đặt tên cho cả hai tham số vì chúng giống nhau. Dường như nó đang làm một số mù của các tham số được đặt tên và không nhận ra rằng chúng là các tham số có cùng tên. SQL Server dường như cho phép tôi làm điều này với cùng một mã ở trên. Tôi đoán nó chỉ là một trong những khác biệt trong các nhà cung cấp, nhưng hy vọng ai đó đã chạy vào điều này và có một giải pháp cho DB2 không đi vào mã DB2 cụ thể.
Cảm ơn, đánh giá cao sự trợ giúp.
Bạn đã bao giờ tìm ra giải pháp cho vấn đề này chưa? Chúng tôi đang trải qua cùng một hành vi – Andronicus
Thật không may, tôi đã không tìm thấy một giải pháp. Tôi đã phải tạo một tham số có tên khác và chỉ định nó cùng một giá trị. – Brent
Thú vị. Khá mới với ADO.NET, tôi chưa nhận ra rằng một nhà cung cấp .NET có thể cho phép bạn sử dụng các tham số có tên với DB2 cho i. DB2 trên IBM i sử dụng '?' [Dấu tham số] (http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzpreph2.htm). Tôi giả sử một số lớp ở phía Windows dịch các tham số được đặt tên vào một dấu hỏi, trước khi gửi yêu cầu đến máy chủ. – WarrenT