sql server-C#与数据库的连接和非查询执行

本文关键字:查询 执行 连接 server-C# 数据库 sql | 更新日期: 2023-09-27 17:50:31

只是想知道在使用这种形式的数据库命令/连接时是否存在任何典型的问题。有什么"更好"的吗?任何其他可能帮助我提高TSQL/C#技能的东西都将不胜感激!非常感谢。

private void Approval_Status(object sender, EventArgs e)
    {
        Button Approval = (Button)sender;
        /*
         * Boolean determining if the request was approved or denied
         */
        Boolean Status = false;
        if (ValidateApproval(Approval.Text.Trim().ToUpper()) == true)
        {
            SqlCommand cmd0 = new SqlCommand();
            cmd0.Connection = db.con(user.Authority);
            cmd0.CommandType = CommandType.Text;
            cmd0.CommandText = "UPDATE [TBL_REQUEST] " +
                "SET [TBL_REQUEST].[REQUEST_STATUS]=@Status, [TBL_REQUEST].[APPROVED_BY]=@Approver, " +
                "[TBL_REQUEST].[DATE_APPROVED]=@Date, [TBL_REQUEST].[PRINTED_NAME]=@Name, " +
                "[TBL_REQUEST].[TITLE]=@Title, [TBL_REQUEST].[PTO_USED]=@Used " +
                "WHERE [TBL_REQUEST].[ID]=@ID; ";
            if (Approval.Text.ToUpper() == codes.RequestApproved)
            {
                cmd0.Parameters.AddWithValue("@Status", SqlDbType.VarChar).Value = codes.RequestApproved;
                Status = true ;
            }
            else
            {
                cmd0.Parameters.AddWithValue("@Status", SqlDbType.VarChar).Value = codes.RequestDenied;
                Status = false;
            }
            cmd0.Parameters.AddWithValue("@Approver", SqlDbType.VarChar).Value = user.User;
            cmd0.Parameters.AddWithValue("@Date", SqlDbType.Date).Value = DateTime.Today.ToShortDateString();
            cmd0.Parameters.AddWithValue("@Name", SqlDbType.VarChar).Value = txtApproval.Text.Trim();
            cmd0.Parameters.AddWithValue("@Title", SqlDbType.VarChar).Value = user.Title;
            cmd0.Parameters.AddWithValue("@Used", SqlDbType.Float).Value = (float)nudUsed.Value;
            cmd0.Parameters.AddWithValue("@ID", SqlDbType.VarChar).Value = txtID.Text.Trim();
            /*
             * Execute our non-query
             */
            db.conEstablished.Open();
            cmd0.ExecuteNonQuery();
            db.conEstablished.Close();
            /*
             * Dispose our resources
             */
            cmd0.Dispose();
            ClearRequestsPanel();
            /*
             * Inform our user of a successful update
             */
            if (Status == true)
            {
                MessageBox.Show(msg.RequestApproved);
            }
            else if (Status == false)
            {
                MessageBox.Show(msg.RequestDenied);
            }
        }

sql server-C#与数据库的连接和非查询执行

看起来您可能正在尝试创建自己的连接池。不要那样做:

  • 对所有可支配资源使用using语句。其中包括CCD_ 2和CCD_。这样,即使抛出异常,资源也会被丢弃
  • 为每个数据库操作创建一个新的SqlConnection,并让系统管理池化真实网络连接

目前尚不清楚db.con(...)db.conEstablished是什么,但听起来很可能只有一个连接,这意味着您无法在多线程环境中安全地使用此代码。有一个helper方法来创建SqlConnection是可以的,但它每次只应该创建一个新的方法,然后在操作完成时处理它。

此外,您应该开始遵循.NET命名约定,并使用以下代码:

if (Status == true)
{
    MessageBox.Show(msg.RequestApproved);
}
else if (Status == false)
{
    MessageBox.Show(msg.RequestDenied);
}

最好写成:

MessageBox.Show(Status ? msg.RequestApproved : msg.RequestDenied);

using是处理SqlConnection等一次性对象的"正确"方法。

代码的部分问题是,如果查询导致异常,那么这一行将被跳过,因为异常将从方法中爆发:

cmd0.Dispose();

当使用using时,即使异常退出块,也将始终调用dispose(在内部,它只是将代码封装在try/catch中,并将对.Dispose()的调用放入catch块中。(

您还应该注意,SqlConnection类在内部处理池。它实际上并不是到数据库的单一开放网络连接。

您的代码应该是这样的。很明显,我这里有其他地方定义的变量,但希望这能让你更好地了解如何使用using

using(var dbconn = new SqlConnection(connectionString))
{
    using (var dbcmd = new SqlCommand(storedProcedure, dbconn))
    {
        dbcmd.CommandType = CommandType.StoredProcedure;
        dbcmd.Parameters.AddRange(sqlParameters.ToArray());
        dbconn.Open();
        return dbcmd.ExecuteNonQuery();
    }
}