1

すべてのタイプのデータベース(Oracle、MySQL、SQLite)で動作する一般化されたアプリケーションを開発したいと思います。そのため、1つの共通の場所から各フォームに異なるデータソースを提供しました。

また、複数のパラメーターを受け入れることができるパラメーター化されたクエリを使用したいと思います。DbParameterを使用して複数のパラメーターを渡すことができません。単一のパラメーターのクエリでは正常に機能しますが、多くのパラメーターでは機能しません。

だから私を助けてください...

            dbconnect dc = new dbconnect();//class which contain data source name
            DbConnection con;
            DbCommand cmd;
            DbDataReader dr;
            DbProviderFactory df;
            DataAdapter da;

            df = DbProviderFactories.GetFactory(dbconnect.dbprovider);
            con = df.CreateConnection();
            con.ConnectionString = dbconnect.sqlstr;
            con.Open();
            cmd = df.CreateCommand();
            cmd.CommandText = "update customer set" + " name='@name'," + "address='@address'," + "phone='@phone' " + "where code='@code';";
            cmd.Connection = con;
            DbDataAdapter daa = df.CreateDataAdapter();
            daa.UpdateCommand = cmd;

            DbParameter param = df.CreateParameter();

            param.ParameterName = "@name";
            param.Value = txtname.Text;

            param.ParameterName = "@address";
            param.Value = txtadd.Text;

            param.ParameterName = "@phone";
            param.Value = txtphone.Text;

            param.ParameterName = "@code";
            param.Value = txtcode.Text;
            daa.UpdateCommand.Parameters.Add(param);
            daa.UpdateCommand.ExecuteNonQuery();

            **But this not working.** 
4

3 に答える 3

4

このコードが問題です:

DbParameter param = df.CreateParameter();

param.ParameterName = "@name";
param.Value = txtname.Text;

param.ParameterName = "@address";
param.Value = txtadd.Text;

param.ParameterName = "@phone";
param.Value = txtphone.Text;

param.ParameterName = "@code";
param.Value = txtcode.Text;
daa.UpdateCommand.Parameters.Add(param);

1つのパラメーターオブジェクトを作成し、そのプロパティParameterNameとプロパティを数回変更してから、その1つのパラメーターをコマンドにValue追加します。これにより、単一のパラメーターを持つコマンドが残ります。その名前と値は、最後に設定したものになります。

代わりに、いくつかの個別のパラメーターを追加する必要があるため、Parameters.Add数回呼び出す必要があります。例えば:

DbParameter nameParam = df.CreateParameter();
nameParam.ParameterName = "@name";
nameParam.Value = txtname.Text;
daa.UpdateCommand.Parameters.Add(nameParam);

DbParameter addressParam = df.CreateParameter();
addressParam.ParameterName = "@address";
addressParam.Value = txtadd.Text;
daa.UpdateCommand.Parameters.Add(addressParam);
// etc

これは、指定された名前と値を持つパラメーターを追加するメソッドを抽出することで、はるかにクリーンにすることができます。

AddParameter(daa.UpdateCommand, "@name", txtname.Text);
AddParameter(daa.UpdateCommand, "@address", txtadd.Text);
// etc
于 2012-07-17T13:10:58.763 に答える
2

パラメータを1つだけ作成しています

        DbParameter param = df.CreateParameter();

        param.ParameterName = "@name";
        param.Value = txtname.Text;

等...

DbParameterそれぞれに新しいものを作成する必要があります

        DbParameter param = df.CreateParameter();
        param.ParameterName = "@name";
        param.Value = txtname.Text;
        daa.UpdateCommand.Parameters.Add(param);

        param = df.CreateParameter();
        param.ParameterName = "@address";
        param.Value = txtadd.Text;
        daa.UpdateCommand.Parameters.Add(param);

等....

それぞれをコマンドに追加します。

于 2012-07-17T13:10:42.377 に答える
0

DbDataAdapterは通常、一括更新または複数行の更新に使用されます。単一行の更新には、DbCommandを使用します。

DbProviderFactory df = DbProviderFactories.GetFactory(dbconnect.dbprovider);             
            using(DbConnection con = df.CreateConnection())
            {
                con.ConnectionString = "dbconnect.sqlstr";              
                DbCommand cmd = df.CreateCommand(); 
                cmd.CommandText = "update customer set" + " name='@name'," + "address='@address'," + "phone='@phone' " + "where code='@code';";
                cmd.Connection = con; 

                DbParameter param1 = df.CreateParameter(); 
                param1.ParameterName = "@name"; 
                param1.Value = txtname.Text;

                DbParameter param2 = df.CreateParameter(); 
                param2.ParameterName = "@address"; 
                param2.Value = txtadd.Text; 

                DbParameter param3 = df.CreateParameter(); 
                param3.ParameterName = "@phone"; 
                param3.Value = txtphone.Text; 

                DbParameter param4 = df.CreateParameter(); 
                param4.ParameterName = "@code"; 
                param4.Value = txtcode.Text;

                con.Open();
                cmd.ExecuteNonQuery();
            }
于 2012-07-17T13:51:42.077 に答える