17

動的 SQL 生成の使用を停止し、バインド変数の使用を奨励する取り組みの一環として、いくつかの問題に直面しています。

Oracle Data Providers for .NET を使用して、ASP.NET ページから Oracle 9i データベースにクエリを実行しています。

クエリは

sql = "SELECT somedata FROM sometable WHERE machine = :machineName ";

Oracle パラメータを次のように定義します。

OracleParameter parameter = new OracleParameter();
parameter.ParameterName = "machineName";
parameter.OracleDbType = OracleDbType.Varchar2;
parameter.Value = machine; //machine is a variable of type string
parameterList.Add(parameter);

これは、「=」演算子では問題なく機能します。しかし、「LIKE」で機能させることができないようです。「%」ワイルドカードの使用を受け入れるようにクエリをフォーマットする方法がわかりません。

私が試してみました:

sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName% ";
sql = "SELECT somedata FROM sometable WHERE machine LIKE ':machineName%' ";
sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName||% ";

また:

parameter.Value = machine+'%';

しかし、ORA-00911 (不正な文字) と ORA-01036 (不正な名前/値) の例外しか表示されません。

私は何を間違っていますか?

4

2 に答える 2

33

試す:

sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName || '%' ";

BIND 変数のため、単一引用符で囲む必要はありません。しかし、% はそうではないので、カプセル化する必要があると思います。

于 2010-09-24T19:48:08.607 に答える
0

完全なクエリの例を次に示します。

string commandText = "SELECT LastName, FirstName FROM PEOPLE WHERE UPPER(LastName) LIKE '%' || :lastName || '%' AND UPPER(FirstName) LIKE '%' || :firstName || '%'";

string oradb = "yourDatabaseConnectionStringHere"; // Might want to add Using statement for this code and try catch

OracleConnection conn = new OracleConnection(oradb); // C#
conn.Open();
OracleCommand cmd = new OracleCommand
{
     Connection = conn,
     CommandText = commandText,
     CommandType = CommandType.Text
};

/*IMPORTANT: adding parameters must be in order how they are in order in the SQL statement*/
cmd.Parameters.Add(new OracleParameter("lastName", model.LastName.Trim().ToUpper()));
cmd.Parameters.Add(new OracleParameter("firstName", model.FirstName.Trim().ToUpper()));

OracleDataReader dr = cmd.ExecuteReader();
于 2021-04-23T16:37:51.423 に答える