【问题标题】:How do i add my customer data into a SQL database?如何将我的客户数据添加到 SQL 数据库中?
【发布时间】:2021-04-29 08:12:16
【问题描述】:

这是我的 CustomerRegister 类,但我似乎无法将 addressTextBox 中的数据输入到 CustomerTbl。

DataBase dbObj = new DataBase();

string selStr = "Update CustomerTbl Set customer_address = '" + addressTextBox.Text + "' Where custID = " + "NULL";
 int i = dbObj.ExecuteNonQuery(selStr);

这是我的数据库类,但return comdObj.ExecuteNonQuery(); 不起作用,因为没有名为 NULL 的此类 custID。那么我该如何编程,以便在新用户注册时能够不断更新数据库?

class DataBase
    {
        string connStr = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\OOPG\Banking Mini Project Raynard\Banking Mini Project Raynard\Database1.mdf;Integrated Security = True";
        SqlConnection connObj;
        SqlCommand comdObj;
        SqlDataReader dR;

        public DataBase()
        {
            connObj = new SqlConnection(connStr);
            connObj.Open();
        }
        public SqlDataReader ExecuteReader(string selStr)
        {
            comdObj = new SqlCommand(selStr, connObj);
            dR = comdObj.ExecuteReader();
            return dR;
        }
        public int ExecuteNonQuery(string sqlStr)
        {
            comdObj = new SqlCommand(sqlStr, connObj);
            return comdObj.ExecuteNonQuery();
        }
    }

【问题讨论】:

  • 重要:您的 SQL 方法对于 SQL 注入来说是成熟的。您应该从不连接用户输入来创建 SQL(这对于 i18n/l10n 和其他原因也很不利)。总是总是总是:使用参数。这真的很很重要(否则有人可能会轻易破坏或泄露您的数据;老实说,这是破解应用程序的最简单方法)
  • 在明显的 sql 注入弱点之外:实际上您不应该尝试重用连接、命令和其他 ado.net 实例。创建、使用、处置通常被认为是最佳实践。
  • 查看How can I add user-supplied input to an SQL statement? 了解如何使用sql参数。请参阅Exploits of a Mom 以获取一个有趣的卡通片来说明 sql 注入如何损害您的应用程序数据。

标签: c# visual-studio-2019


【解决方案1】:

首先,您应该在执行任何查询之前创建到 SQL 数据库的连接。之后,您应该能够在将任何数据更新到数据库之前插入数据。成功插入数据后,您可以使用上述命令文本更新数据。这是一些插入数据以注册客户的示例代码。

using (SqlCommand command = new SqlCommand())
{
    command.Connection = connection;            // <== lacking
    command.CommandType = CommandType.Text;
    command.CommandText = "INSERT into CustomerTbl (CustId, Name, Address) VALUES (@CustId, @Name, @Address)";
    command.Parameters.AddWithValue("@CustId", name);
    command.Parameters.AddWithValue("@Name", userId);
    command.Parameters.AddWithValue("@Address", idDepart);

    try
    {
        connection.Open();
        int recordsAffected = command.ExecuteNonQuery();
    }
    catch(SqlException)
    {
        // error here
    }
    finally
    {
        connection.Close();
    }
}

【讨论】:

  • 小观察:因为我们看不到这个连接的生命周期,所以像这样使用Open()/Close() 可能是不合适的(如果我们是创建 连接,然后是的:需要调用Open()
【解决方案2】:

如果您要添加记录,则需要INSERT,而不是UPDATE。例如(这里使用"Dapper" 完成所有繁重的工作,包括参数处理):

using Dapper;
//...
void UpsertAddress(int? id, string address)
{
    if (id is null)
    {
        connection.Execute("insert CustomerTbl (customer_address) values (@address);",
            new { address }); // possibly using the OUTPUT clause to fetch an IDENTITY
    }
    else
    {
        connection.Execute(
            "update CustomerTbl set customer_address = @address where custID = @id;",
            new { id, address });
    }
}

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2021-02-20
    • 2021-08-18
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多