2

System.Data.OleDb 名前空間とメソッド OleDbCommandObject.ExecuteNonQuery() を使用して Access データベースにデータを挿入しようとしていますが、次のようなエラーが表示されます。

OleDbParameterCollection は、null 以外の OleDbParameter 型のオブジェクトのみを受け入れます。パラメータ名: 値

パラメータ ? _[#] にはデフォルト値がありません

私のパラメータのほとんどは、フォームを介して値が割り当てられたときに正常に機能する文字列オブジェクトです。ただし、必須ではないフィールドを空白のままにして (つまり、someString = "")、フォームを送信すると、エラーが発生します。このサイトや、次のような可能な解決策について言及している他のサイトで回答を探しました。

  • OleDb は ? 名前の値の代わりに
  • パラメータの数が ? の数と一致し、正しい順序で挿入されていることを確認してください。
  • command.Parameters.Add(new OleDbParameter("Name", OleDbType.VarChar, 50, "Column").Value = someString); を使用します。またはそれらの線に沿った何か。
  • command.Parameters.AddWithValue("parameterName", someString); を使用します。

文字列の値を「[スペース]」に設定することもできますが、これによりフォーム内のプレースホルダーが削除されます。これは理想的ではなく、必要であるとは思えません。パラメーター リストに値を追加する前に、空の文字列を確認してスペースを追加する必要がある場合は、そうしますが、可能であれば余分なコードは避けたいと考えています。

私が使用しているコードの例を次に示します。

Customer.cs

    public class Customer
    {
    [Required]
    public string ContactFirstName { get; set; }

    [Required]
    public string ContactLastName { get; set; }

    public string Email {get; set; }
    public string Phone {get; set; }

    public Customer()
    {
        this.ContactFirstName = "";
        this.ContactLastName = "";
        this.Email = "";
        this.Phone = "";
    }
    }

データの挿入に使用されるメソッド

public int InsertValues(Customer customer)
{
this.dbConn.Open(); //System.Data.OleDb.OleDbConnection

this.query = "INSERT INTO someTable (ContactFirstName, ContactLastName, Email, Phone) VALUES (?,?,?,?)";
this.dbComm = new OleDbCommand(this.query, this.dbConn); //System.Data.OleDb.OleDbCommand

//Add parameters
this.dbComm.Parameters.AddWithValue("ContactFirstName", customer.ContactFirstName);
this.dbComm.Parameters.AddWithValue("ContactLastName", customer.ContactLastName);
this.dbComm.Parameters.AddWithValue("Email", customer.Email);
this.dbComm.Parameters.AddWithValue("Phone", customer.Phone);

this.dbComm.ExecuteNonQuery();

//--Snip--
}

私が使用している ODBC ドライバーは Microsoft.OleDb.ACE.12.0 です。私を正しい方向に導くことができる助けや情報は大歓迎です。

4

2 に答える 2

0

この問題には他の解決策があるかもしれませんが、これは試行錯誤の結果、少量のコードを追加して見つけたものであり、代わりにこれを行うメソッドを作成することで改善できます。

OP と Gökhan Girgin の応答で指摘されているように、AddWithValue メソッドは次のように表示されます。

OleDbCommandObject.Parameters.AddWithValue("Whatever you want here", Value);

ここで、私の主な焦点は、値を含まないパラメーター リストに文字列値を追加することです (つまり、ユーザーがフィールドを空白のままにしたフォームで)。文字列は、"[no_space]" のように単純に空白です。発生しているように見えるのは、フォームの送信時に、この値が「[no_space]」から null に変更されることです。Value を文字列型に型キャストしようとしても、問題は解決しません。私が見つけた解決策は、別の空白文字列を値に連結することでした。

このリストは網羅的ではない可能性が高いですが、以下の組み合わせのいずれかが機能することがわかりました。OleDb でパラメーターを追加するときは、INSERT ステートメントと同じ順序であることを確認してください。

OleDbCommandObject.Parameters.AddWithValue("@Phone", "" + customer.Phone);
OleDbCommandObject.Parameters.AddWithValue("@Phone", customer.Phone + "");
OleDbCommandObject.Parameters.AddWithValue("@Phone", "" + customer.Phone + "");

繰り返しますが、コンストラクターで文字列が既に "[no_space]" に設定されているため、フォーム送信時に値が null に変更されない限り、これを行う必要があることは意味がありません。別の「[no_space]」を追加すると何が変わるかわかりませんが、受け入れられ、エラーは発生しません。なぜこれが機能するのかを誰かが明らかにできれば幸いです。

この問題に遭遇した他の人にとって、これが役立つことを願っています。

于 2013-06-14T12:44:39.837 に答える
0

これを変える

public int InsertValues(Customer customer)
{
this.dbConn.Open(); //System.Data.OleDb.OleDbConnection

this.query = "INSERT INTO someTable (ContactFirstName, ContactLastName, Email, Phone) VALUES (@ContactFirstName,@ContactLastName,@Email,@Phone)";
this.dbComm = new OleDbCommand(this.query, this.dbConn); //System.Data.OleDb.OleDbCommand

//Add parameters
this.dbComm.Parameters.AddWithValue("@ContactFirstName", customer.ContactFirstName);
this.dbComm.Parameters.AddWithValue("@ContactLastName", customer.ContactLastName);
this.dbComm.Parameters.AddWithValue("@Email", customer.Email);
this.dbComm.Parameters.AddWithValue("@Phone", customer.Phone);

this.dbComm.ExecuteNonQuery();

//--Snip--
}
于 2013-06-13T23:33:45.257 に答える