【发布时间】:2023-03-16 13:31:02
【问题描述】:
我以编程方式创建一个数据库,然后在数据库中创建一个表。创建了数据库,但没有创建表。
// Create Database
try
{
using (SqlCommand cmd = new SqlCommand(connstr, sqlConn))
{
try
{
sqlConn.Open();
cmd.ExecuteNonQuery();
MessageBox.Show("DataBase is Created Successfully", "MyProgram", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButton.OK, MessageBoxImage.Information);
}
finally
{
if (sqlConn.State == ConnectionState.Open)
{
sqlConn.Close();
}
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
// Create table
try
{
using (SqlCommand cmd = new SqlCommand(
"CREATE TABLE dbo.MyTable ("
+ "ID int IDENTITY(1,1) PRIMARY KEY,"
+ "MyProduct nvarchar(100) NOT NULL,"
+ "MyDateTime datetime NOT NULL);"
+ "", sqlConn))
{
sqlConn.Open();
cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
但我收到错误消息说我的连接没有关闭。
我尝试反复将 sqlConn.Close() 添加到每个 {block} 的末尾,但仍然出现相同的错误。创建数据库后如何正确关闭连接然后再次重新打开连接以创建表?
[编辑]
在回答输入之后,我已经重组了我的代码,我确信在不重复 Open() 的情况下包装属性。
// Create Database
try
{
using (SqlConnection sqlConn = new SqlConnection(sqlConnectionStr))
{
using (SqlCommand cmd = new SqlCommand(connstr, sqlConn))
{
try
{
sqlConn.Open();
cmd.ExecuteNonQuery();
MessageBox.Show("DataBase is Created Successfully", "MyProgram", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString(), "MyProgram", MessageBoxButton.OK, MessageBoxImage.Information);
}
finally
{
if (sqlConn.State == ConnectionState.Open)
{
sqlConn.Close();
}
}
}
}
}
catch(Exception ex)
{
MessageBox.Show("(1)\n" + ex.ToString());
}
// Create Table
try
{
using (SqlConnection sqlConn = new SqlConnection(sqlConnectionStr))
{
using (SqlCommand cmd = new SqlCommand("CREATE TABLE dbo.MyTable ("
+ "ID int IDENTITY(1,1) PRIMARY KEY,"
+ "MyProduct nvarchar(100) NOT NULL,"
+ "MyDateTime datetime NOT NULL);"
+ "", sqlConn))
{
sqlConn.Open();
cmd.ExecuteNonQuery();
sqlConn.Close();
}
}
}
catch (Exception ex)
{
MessageBox.Show("(2)\n" + ex.ToString());
}
然后我收到错误数据库中已经有一个名为“MyTable”的对象。但是当我查看 SSMS 时,该表不存在。我现在很困惑。
【问题讨论】:
-
最好显示哪个是 MyDatabase.cs:line 94。
-
请停止写
catch Exception- 这是一个糟糕的糟糕的反模式。您应该只捕获您可以有意义地处理的特定异常。 -
根据各种答案告诉您将 Connections 与 Using 块结合使用,我建议阅读 IDisposable 以及 Using 块如何与该接口一起使用。这将告诉你为什么不需要在 Connection 和其他有意义的细节上调用 Close()。
标签: c# wpf sql-server-2016