3

我在 MySQL Workbench 中有一个数据库,其中包含(姓名、姓氏、年龄、地址等)和 Visual Studio 中的 Windows 桌面应用程序(表单),您可以在其中插入、搜索和更新。当我从表单插入数据并将某些字段留空时,它们在数据库中保存为空白,我希望它们保存为空。有没有办法做到这一点?

这是并插入按钮代码:

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();

非常感谢,它工作正常,但我对带空格的单词有疑问,例如:(父亲姓名,母亲姓名等)。当我在名称处插入一个值时很好,但是当我在父亲姓名或母亲姓名处插入一个值时,它为空。我认为这是因为单词之间的空间。

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

一种方法是简单地自己进行解释:

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;
        }
    }
}

使用此解决方案,您将正确处理连接和命令对象,但您还可以简化字符串以null处理利用准备好的查询,使该过程更简单更安全,因为它不对 SQL 注入开放。

注意:您看到的静态类应该放在它自己的.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 回答
-1

尽管这些列在数据库中显示为空白,但它们实际上为空。您可以通过读取 C# 中的这些字段并将其与 System.DBNull 进行比较来验证这一点。

于 2013-05-21T17:06:02.177 回答