0

このコードを使用すると、テーブル内のすべての行が返されますが、その理由がわかりません。

string SelectOleDb = "SELECT Top 1 * From `Employee Info` Where [Employee Name]=@EmployeeName" Order By ID DESC";

OleDbConnection OleDbCon = new OleDbConnection(EmployeeInfo.Properties.Settings.Default.cstrEmployeeInfoDatabase);
OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter();
OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon);
OleDbCom.Parameters.AddWithValue("@EmployeeName", employee_NameComboBox.Text);
OleDbAdpt.SelectCommand = OleDbCom;

DataSet FooDS = new DataSet();
OleDbCon.Open();
OleDbAdpt.Fill(FooDS);
OleDbCon.Close();
OleDbCon.Dispose();
DataTable EmployeeInfo = FooDS.Tables[0];

また、従業員名列の値をコピーしてテキスト ボックスに貼り付け、有効な従業員名を使用していることを確認しました。ただし、ステートメントが正しくない場合は、すべての代わりに何も返されないと予想されます。

更新:名前付きパラメーター「@EmployeeName」を削除し、単一引用符で囲まれたハードコードされた名前を入力しようとしました。まだステートメントは従業員情報のすべてを返します

4

3 に答える 3

3

2 つの異なるDataSets を使用しているようです:

DataSet FooDS = new DataSet();   // <-- FooDS?
OleDbCon.Open();
OleDbAdpt.Fill(ExpediteDS);   // <-- filing a different dataset?
OleDbCon.Close();
OleDbCon.Dispose();
DataTable EmployeeInfo = FooDS.Tables[0];  // <-- not the dataset you just filled!

これがコピー/貼り付けエラーである場合は、コードをそのまま投稿してください。コードを「ダミー」にしようとすると、人々がうさぎを追いかけて、実際の問題を明らかにしなくなります

于 2013-03-12T16:48:28.463 に答える
1

他の人は、OleDb には ? が必要だと述べています。また、名前付きパラメーターを受け入れませんでした。これは誤りです。コードを修正しましたが、動作しています。当面の問題は、ステートメントがスペースを定義するためにさまざまな方法を必要とすることでした。

OleDB 接続では、テーブル名にスペースが含まれている場合は、どちらかの `(Ticks) にする必要がありましたが、両方とも同じように機能します。

列名にスペースが含まれていると、混乱が始まります。ステートメントが作成されるとき すべての列名には、列名のスペースの代わりに _ (Under Score) が必要です。`(Ticks) と列名はどちらもオプションです。必要なのは、" "(スペース) を _(アンダースコア) に置き換えることだけです。

混乱を招くのは、テーブル名に `(目盛り) または (スペース) を _(スコアの下) に置き換えると、テーブルが見つからないことが必須であるという事実です。

私の固定コード:

        string SelectOleDb = "SELECT Top 1 * From [Employee Info] Where Employee_Name= @EmployeeName Order By ID DESC";

        OleDbConnection OleDbCon = new OleDbConnection(EmployeeInfo.Properties.Settings.Default.cstrEmployeeInfoDatabase);
        OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter();
        OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon);
        OleDbCom.Parameters.AddWithValue("@EmployeeName", employee_NameComboBox.Text);
        OleDbAdpt.SelectCommand = OleDbCom;

            DataSet EmployeeInfoDS = new DataSet();
            OleDbCon.Open();
            OleDbAdpt.Fill(EmployeeInfoDS);
            OleDbCon.Close();
            OleDbCon.Dispose();
            DataTable EmployeeInfoDT = EmployeeInfoDS.Tables[0];
于 2013-03-12T17:53:30.540 に答える
0

MSDN で文書化されているとおり:

CommandType が Text に設定されている場合、OLE DB .NET プロバイダーは、OleDbCommand によって呼び出される SQL ステートメントまたはストアド プロシージャにパラメーターを渡すための名前付きパラメーターをサポートしません。この場合、疑問符 (?) プレースホルダーを使用する必要があります。

? を使用して、クエリの変形と SQL Server への OLEDB 接続を試しました。期待どおりに機能しました。名前付きパラメーターの使用は失敗します。

リクエストに応じて、サンプルは次のとおりです。

        string SelectOleDb = "SELECT Top 1 * From users Where [application_user_name]=? Order By application_user_id DESC";

        OleDbConnection OleDbCon = new OleDbConnection("Provider=SQLOLEDB;Data Source=SERVER\\INSTANCE;Initial Catalog=samples;Trusted_Connection=yes");

        OleDbDataAdapter OleDbAdpt = new OleDbDataAdapter();
        OleDbCommand OleDbCom = new OleDbCommand(SelectOleDb, OleDbCon);
        OleDbCom.Parameters.AddWithValue("@EmployeeName", "smith");
        OleDbAdpt.SelectCommand = OleDbCom;

        DataSet ExpediteDS = new DataSet();

        DataSet FooDS = new DataSet();
        OleDbCon.Open();
        OleDbAdpt.Fill(ExpediteDS);
        OleDbCon.Close();
        OleDbCon.Dispose();

OLEDB では、パラメーターの順序が重要であることに注意してください。クエリで参照する順序で ParameterCollection に追加する必要があります。

于 2013-03-12T17:02:05.720 に答える