在使用这种形式的数据库命令/连接时,只是想知道是否存在任何典型问题。有什么“更好”的东西吗?任何其他可能帮助我提高我的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);
}
}
答案 0 :(得分:4)
看起来您可能正在尝试创建自己的连接池。不要这样做:
using
语句。其中包括SqlConnection
和SqlCommand
。这样,即使抛出异常,也会处理资源SqlConnection
,让系统管理真正的网络连接池。不清楚db.con(...)
和db.conEstablished
是什么,但听起来就像你很可能只有一个连接 - 这意味着你不能使用它在多线程环境中安全地编码。可以使用辅助方法创建SqlConnection
,但每次都应该创建一个新方法,然后在操作完成后进行处理。
此外,您应该开始遵循.NET命名约定和此代码:
if (Status == true)
{
MessageBox.Show(msg.RequestApproved);
}
else if (Status == false)
{
MessageBox.Show(msg.RequestDenied);
}
...最好写成:
MessageBox.Show(Status ? msg.RequestApproved : msg.RequestDenied);
答案 1 :(得分:2)
using
是处理像SqlConnection这样的一次性对象的“正确”方法。
您的代码的部分问题是,如果查询导致异常,则会跳过此行,因为该异常将突破该方法:
cmd0.Dispose();
当使用using
时,将始终调用dispose,即使异常退出块(在内部它只是将代码包装在try/catch
中并将调用放入.Dispose()
抓住了。)
另外,您应该注意SqlConnection
类在内部处理池化。它实际上并不是与DB的单一开放式网络连接。
答案 2 :(得分:0)
您的代码看起来应该是这样的。显然我在这里有变量在其他地方定义,但希望这可以让你更好地了解如何使用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();
}
}