34

私は Visual C# 2010 と MySQL バージョン 5.1.48-community を使用しています。このコードで私を助けてくれることを願っています。私はそれが私に働いているとは思いません。私は何が欠けていますか?

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connString);
conn.Open();
MySqlCommand comm = conn.CreateCommand();
comm.CommandText = "INSERT INTO room(person,address) VALUES(@person, @address)";
comm.Parameters.Add("@person", "Myname");
comm.Parameters.Add("@address", "Myaddress");
comm.ExecuteNonQuery();
conn.Close();

そして、コンパイルしようとすると。それは言います:

Person 列を null にすることはできません

編集:

しかし、このコードを試すと。

comm.CommandText = "INSERT INTO room(person,address) VALUES('Myname', 'Myaddress')";

しかし、このコードはSQLインジェクション攻撃を受けやすいですが、機能し、エラーは発生しません。

編集:

これを使ってみました。ここで見つけたので、うまくいくと思いましたが、このエラーが発生します

インデックス (ゼロベース) は、ゼロ以上で、引数リストのサイズ未満でなければなりません。

何か案が?

    string a = "myname";
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = conn;
    cmd.CommandText = "INSERT INTO room(person,address) VALUES(?,?)";
    //cmd.Prepare();

    cmd.Parameters.Add("person", MySqlDbType.VarChar).Value = a;
    cmd.Parameters.Add("address", MySqlDbType.VarChar).Value = "myaddress";
    cmd.ExecuteNonQuery(); // HERE I GOT AN EXCEPTION IN THIS LINE

どんな助けでも大歓迎です。

編集済み: 解決済み 私はこのコードを使用しました:

cmd.CommandText = "INSERT INTO room(person,address) VALUES(?person,?address)";
cmd.Parameters.Add("?person", MySqlDbType.VarChar).Value = "myname";
cmd.Parameters.Add("?address", MySqlDbType.VarChar).Value = "myaddress";
cmd.ExecuteNonQuery();

ありがとうございます!

4

9 に答える 9

27

AddWithValue次のような方法を使用できます。

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connString);
conn.Open();
MySqlCommand comm = conn.CreateCommand();
comm.CommandText = "INSERT INTO room(person,address) VALUES(@person, @address)";
comm.Parameters.AddWithValue("@person", "Myname");
comm.Parameters.AddWithValue("@address", "Myaddress");
comm.ExecuteNonQuery();
conn.Close();

また

?の代わりに試してみてください@:

string connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
MySqlConnection conn = new MySqlConnection(connString);
conn.Open();
MySqlCommand comm = conn.CreateCommand();
comm.CommandText = "INSERT INTO room(person,address) VALUES(?person, ?address)";
comm.Parameters.Add("?person", "Myname");
comm.Parameters.Add("?address", "Myaddress");
comm.ExecuteNonQuery();
conn.Close();

それが役に立てば幸い...

于 2013-04-23T11:23:12.267 に答える
5

私は同じ問題を抱えていました - 最後に?@ の代わりに sigil を使用すると、うまくいきました。

ドキュメントによると:

ノート。以前のバージョンのプロバイダーでは、'@' 記号を使用して SQL のパラメーターをマークしていました。これは MySQL ユーザー変数と互換性がないため、プロバイダーは「?」を使用するようになりました。SQL でパラメーターを検索するための記号。古いコードをサポートするには、接続文字列に 'old syntax=yes' を設定できます。これを行う場合、SQL で使用する予定のパラメーターを定義し損ねた場合、例外がスローされないことに注意してください。

本当に?誰かがいわゆる古い構文を使用しようとした場合に、例外をスローしないのはなぜですか? 20 行のプログラムの場合、数時間無駄になります...

MySQL::MySQLコマンド

于 2014-09-02T23:21:33.057 に答える
4

Windows フォーム アプリケーションで mysql-connector-net-5.1.7-noinstall および Visual Studio(2015) を使用してデータを挿入しようとしているときに、非常によく似た問題に直面していました。私は C# の第一人者ではありません。そのため、すべてを解決するには約 2 時間かかります。

次のコードは最近機能します。

string connetionString = null;
connetionString = "server=localhost;database=device_db;uid=root;pwd=123;";

using (MySqlConnection cn = new MySqlConnection(connetionString))
{
    try
    {
        string query = "INSERT INTO test_table(user_id, user_name) VALUES (?user_id,?user_name);";
        cn.Open();
        using (MySqlCommand cmd = new MySqlCommand(query, cn))
        {
            cmd.Parameters.Add("?user_id", MySqlDbType.Int32).Value = 123;
            cmd.Parameters.Add("?user_name", MySqlDbType.VarChar).Value = "Test username";
            cmd.ExecuteNonQuery();
        }
    }
    catch (MySqlException ex)
    {
        MessageBox.Show("Error in adding mysql row. Error: "+ex.Message);
    }
}
于 2016-11-10T09:43:30.087 に答える
-1

必要に応じて、DB タイプに合わせて「SqlDbType」のコードを調整し、次のコードを使用してみてください。

comm.Parameters.Add("@person",SqlDbType.VarChar).Value=MyName;

また:

comm.Parameters.AddWithValue("@person", Myname);

それは機能するはずですが、Command.Parameters.Add() を使用すると、特定の SqlDbType を定義でき、Command.Parameters.AddWithValue() を使用すると、パラメーター値に基づいて暗黙的に SqlDbType を取得しようとしますが、暗黙的にできない場合は壊れることがあります。データ型を変換します。

お役に立てれば。

于 2013-04-23T12:30:03.710 に答える
-2

これを試してみてください

 MySqlCommand dbcmd = _conn.CreateCommand();
    dbcmd.CommandText = sqlCommandString;
    dbcmd.ExecuteNonQuery();
    long imageId = dbcmd.LastInsertedId;
于 2016-12-06T10:26:52.800 に答える