3

(名前、姓、年齢、住所など) のようなフィールドを持つ MySQL Workbench のデータベースと、挿入、検索、更新が可能な c# を使用した Visual Studio の Windows デスクトップ アプリケーション (フォーム) があります。フォームからデータを挿入し、いくつかのフィールドを空のままにすると、それらはデータベースに空白として保存され、null として保存されます。それを実現する方法はありますか?

ここにボタンコードを挿入します:

conn = openconnection.GetConn();

MySqlCommand cmd = new MySqlCommand("INSERT INTO table_name (name,lastname,address, etc...) VALUES (' " + name_textbox.Text + " ',' " + lastname_textbox.Text + " ' etc... );", conn);

cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
conn.Close();

どうもありがとう、それはうまくいきますが、次のようなスペースを含む単語に問題があります: (父の名前、母の名前など)。名前に値を挿入すると問題ありませんが、父の名前または母の名前に値を挿入するとnullになります。単語間のスペースのせいだと思います。

MySqlCommand cmd = new MySqlCommand("INSERT INTO table_name (name,`father name`,`mother name`, etc... VALUES (@name,@`father name`,@`mother name`,etc...);", conn);

cmd.Parameters.AddWithValue("@name", name_textbox.Text.NullString());
cmd.Parameters.AddWithValue("@`father name`", father_name_textbox.Text.NullString());
cmd.Parameters.AddWithValue("@`mother name`", mother_name_textbox.Text.NullString());

cmd.ExecuteNonQuery();
4

3 に答える 3

9

1 つの方法は、単に自分で解釈を行うことです。

string.IsNullOrEmpty(name_textbox.Text) ? null : string.Format("'{0}'", name_textbox.Text);

ただし、別のオプションを提供したいと思います。

using (MySqlConnection conn = openconnection.GetConn())
{
    using (MySqlCommand cmd = new MySqlCommand("INSERT INTO table_name (name,lastname,address) VALUES (@name,@lastname,@address);", conn);
    {
        cmd.Parameters.AddWithValue("@name", name_textbox.Text.NullString());
        cmd.Parameters.AddWithValue("@lastname", lastname_textbox.Text.NullString());
        cmd.Parameters.AddWithValue("@address", address_textbox.Text.NullString());

        cmd.ExecuteNonQuery();
    }
}

namespace System
{
    public static class StringExtensions
    {
        public static string NullString(this string s)
        {
            return string.IsNullOrEmpty(s) ? null : s;
        }
    }
}

このソリューションを使用すると、接続オブジェクトとコマンド オブジェクトを適切に破棄できますが、SQL インジェクションに対してオープンではないため、処理する文字列を合理化し、準備されたクエリ活用してプロセスをよりシンプルnullかつ安全にすることもできます。

注:表示される静的クラスは、独自の.csファイルに配置する必要があります。

于 2013-05-21T17:05:28.633 に答える
1

この気の利いた関数を使用してテスト/挿入するのが好きDBNull.Valueです。

    public static object ToDBNull(object value)
    {
        if (null != value)
            return value;
        return DBNull.Value;
    }

他の場所では便利ですが、あなたの場合:

    MySqlCommand cmd = new MySqlCommand("INSERT INTO table_name (name,lastname,address, etc...)" +
    "VALUES (' " + ToDBNull(name_textbox.Text) + " ',' " + ToDBNull(lastname_textbox.Text) + " ' etc... );", conn)

また、SQL インジェクション攻撃に対する脆弱性を考慮し、パラメーター化された SQL コマンドを検討する必要があります。

于 2013-05-21T17:16:05.190 に答える