2

次のコードの実行中に問題が発生しました。Ngpsql データ アダプターの使用。この関数は、データテーブルの作成および更新クエリを受け取ります

パラメータ文字列値は動的に生成された更新値であり、ローカル変数文字列クエリと連結され、UPDATE xyz SET ecode=@ecode,name=@name ..... などのクエリを作成します。

public void TransactionRecording(DataTable DT, string values,bool update)
    {            
        string Query = "";
        NpgsqlDataAdapter NgAdapter = new NpgsqlDataAdapter();

        if (update)
        {
            Query += "UPDATE Cards SET " + values;
            NgAdapter.UpdateCommand = new NpgsqlCommand(Query, connection);
            this.UpdateParameterSetForLocalToCentral(NgAdapter);

        }
        else
        {
            Query += "INSERT INTO Cards (ecode, ename, fname, address1, address2, address3, deo, employee, active, birth, type, company, Designation, photo, manual, visit_to, visit_name, vehicle, modifideby, registered, validity, tpl, serial, gateno, level, gate_in, gate_out) VALUES(" + values + ")";
            NgAdapter.InsertCommand = new NpgsqlCommand(Query, connection);
            this.InsertParameterSetForLocalToCentral(NgAdapter);
        }


        try { 
            NgAdapter.Update(DT); }catch(Exception ex)
        {    
        MessageBox.Show(ex.Message);
        }


    }

    public void UpdateParameterSetForLocalToCentral(NpgsqlDataAdapter NgAdapter)
    {

        foreach (string name in Enum.GetNames(typeof(LocalToCentralFields)))
        {
            switch (name)
            {
                case "ecode":
                case "ename":
                case "fname":
                case "address1":
                case "address2":
                case "address3":
                case "type":
                case "company":
                case "Designation":
                case "visit_to":
                case "visit_name":
                case "vehicle":
                case "modifideby":                   
                case "serial":
                case "gateno":
                case "level":
                case "gate_in":
                case "gate_out":
                     NpParam = NgAdapter.UpdateCommand.Parameters.Add("@"+name,NpgsqlTypes.NpgsqlDbType.Varchar);
                     break;
                case "deo":
                case "employee":
                case "active":
                     NpParam = NgAdapter.UpdateCommand.Parameters.Add("@" + name, NpgsqlTypes.NpgsqlDbType.Boolean);
                     break;
                case "birth":
                case "registered":
                case "validity":
                     NpParam = NgAdapter.UpdateCommand.Parameters.Add("@" + name, NpgsqlTypes.NpgsqlDbType.Timestamp);
                     break;
                case "photo":
                case "tpl":
                     NpParam = NgAdapter.UpdateCommand.Parameters.Add("@" + name, NpgsqlTypes.NpgsqlDbType.Bytea);
                     break;

            }
           NpParam.SourceVersion = DataRowVersion.Original;
           NpParam.SourceColumn = "ecode";

        }

    }

このエラーを取得するには、DataRow を渡すときに Update Command に Valid InsertCommand が必要です。行を更新しているのに、insert コマンドを要求する理由を教えてください。

ありがとうございました

4

1 に答える 1

1

を呼び出すとNgAdapter.Update、行の rowState に応じて、DataTable の各行に対して適切なコマンドが呼び出されます。rowState が挿入された場合は が呼び出されInsertCommand、rowState が削除された場合は が呼び出されるためDeleteCommand、DataAdapter ですべてのコマンドを定義する必要があります。

于 2013-08-20T07:33:55.900 に答える