C#数据库ConnectionString属性尚未初始化

我正在尝试在我的数据库中插入值,每当我尝试添加它时,我的程序崩溃,给我一个错误,ConnectionString属性尚未初始化,但我正确初始化它。 这是我的代码:

private static string conStr = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=c:\users\aldrin\documents\visual studio 2013\Projects\MidtermAssignment_Ramirez\MidtermAssignment_Ramirez\MasterFile.mdf;Integrated Security=True"; SqlConnection myCon = new SqlConnection(); private int studId, year, units; private string fName, lName, mName, course, payment; public void insertRecord() { myCon.Open(); SqlCommand insertInfo = new SqlCommand("spInsertStudentInformation", myCon); insertInfo.CommandType = CommandType.StoredProcedure; insertInfo.Parameters.Add("@studId", SqlDbType.Int).Value = studId; insertInfo.Parameters.Add("@fName", SqlDbType.VarChar).Value = fName; insertInfo.Parameters.Add("@lName", SqlDbType.VarChar).Value = lName; insertInfo.Parameters.Add("@mName", SqlDbType.VarChar).Value = mName; insertInfo.ExecuteNonQuery(); myCon.Close(); myCon.Open(); SqlCommand insertData = new SqlCommand("spInsertStudentData", myCon); insertData.CommandType = CommandType.StoredProcedure; insertData.Parameters.Add("@studId", SqlDbType.Int).Value = studId; insertData.Parameters.Add("@course", SqlDbType.VarChar).Value = course; insertData.Parameters.Add("@year", SqlDbType.Int).Value = year; insertData.Parameters.Add("@units", SqlDbType.Int).Value = units; insertData.Parameters.Add("@payment", SqlDbType.VarChar).Value = payment; insertData.ExecuteNonQuery(); myCon.Close(); } 

这是我的按钮中的代码:

 myData.StudId = Convert.ToInt32(txtStudId.Text); myData.FName = txtFName.Text; myData.LName = txtLName.Text; myData.MName = txtMName.Text; myData.Course = cboCourse.SelectedItem.ToString(); myData.Year = Convert.ToInt32(cboYear.SelectedItem.ToString()); myData.Units = Convert.ToInt32(txtUnits.Text); myData.Payment = cboPayment.SelectedItem.ToString(); myData.insertRecord(); 

这是我的存储过程:

 CREATE PROCEDURE [dbo].spInsertStudentData @studId int, @course varchar(50), @year int, @units int, @payment varchar(50) AS INSERT INTO StudentData VALUES (@studId, @course, @year, @units, @payment) RETURN 0 CREATE PROCEDURE [dbo].spInsertStudentInformation @studId int, @fName varchar(50), @lName varchar(50), @mName varchar(50) AS INSERT INTO StudentInformation VALUES (@studId, @fName, @lName, @mName) RETURN 0 

我最近在ASP.NET学习数据库,这就是我正在做的事情,但我不知道为什么这在C#中运行不正常。

错误消息很明确。 在尝试打开连接之前,SqlConnection对象需要一个连接字符串。 因此,在构建连接时,您需要传递连接字符串或在打开之前设置ConnectionString属性。

但我真的建议你开始使用本地连接变量而不是全局变量。 并将此声明保留在using语句中

 private static string conStr = @"....."; public void insertRecord() { using(SqlConnection myCon = new SqlConnection(conStr)) using(SqlCommand insertInfo = new SqlCommand("spInsertStudentInformation", myCon)) { myCon.Open(); insertInfo.CommandType = CommandType.StoredProcedure; .... insertInfo.ExecuteNonQuery(); // No need to close the connection here.... SqlCommand insertData = new SqlCommand("spInsertStudentData", myCon); insertData.CommandType = CommandType.StoredProcedure; .... insertData.ExecuteNonQuery(); } } 

SqlConnection使用连接池基础结构,因此最好具有可由连接池回收的本地变量,而无需为程序保留重要资源

最后, using语句避免了危险的内存泄漏关闭和处理一次性对象,如连接和命令,如果出现exception

您的代码中还有另一点需要注意。 您执行两个相关的命令。 如果由于某种原因您无法插入学生数据,我确信您不想插入学生信息。 这些场景要求打开一个SqlTransaction,使您的数据保持primefaces状态 (这意味着如果任何操作失败,您不希望更改数据库中的任何内容

  using(SqlConnection myCon = new SqlConnection(conStr)) using(SqlCommand insertInfo = new SqlCommand("spInsertStudentInformation", myCon)) { myCon.Open(); using(SqlTransaction ts = myCon.BeginTransaction()) { insertInfo.CommandType = CommandType.StoredProcedure; insertInfo.Transaction = ts; .... insertData.CommandType = CommandType.StoredProcedure; insertData.Transaction = ts; .... insertData.ExecuteNonQuery(); ts.Commit(); } } 

最终的Commit将保留数据库中的所有内容,同时退出using块而不调用Commit,将自动回滚对表的每个更改

您需要将在第一行中创建的连接字符串提供给连接构造函数:

 SqlConnection myCon = new SqlConnection(conStr); 

错误信息是如此清晰;

ConnectionString属性尚未初始化

您可以将其ConnectionString属性设置为conStr ;

 myCon.ConnectionString = conStr; 

或者您可以在构造函数上将其指定为参数;

 SqlConnection myCon = new SqlConnection(conStr); 

正如史蒂夫所说; 将SqlConnection保存为全局变量并不是一个好主意。 使用局部变量,并使用using语句来处理连接和命令。

 using(SqlConnection myCon = new SqlConnection(conStr)) using(SqlCommand insertInfo = myCon.CreateCommand()) { ... }