2015-02-08 152 views
2

我试图在我的数据库中插入值,每当我尝试添加它,我的程序只是崩溃,给我一个ConnectionString属性尚未初始化的错误,但我正确初始化它。这里是我的代码:C#数据库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#运行良好。

+0

不要为连接保留全局变量。在using语句中本地声明变量,以确保在变量异常时它将被关闭和处置。 – Steve 2015-02-08 14:48:11

+0

在配置文件中放置连接字符串 – 2015-02-08 14:50:58

回答

5

错误消息很明显。在尝试打开连接之前,SqlConnection对象需要连接字符串。所以当你建立连接时,你需要传递connectionstring或者在打开之前设置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的使用Connection Pooling基础设施,因此,最好是有,可通过连接池被回收的局部变量不保持锁定你的程序的重要资源这里面声明

最后,using statement避免了危险的内存泄漏关闭和处理像连接和命令一样的一次性对象也在例外的情况下

还有一点需要注意在你的代码中。你执行两个相关的命令。如果出于某种原因,您无法插入学生信息,我相信您不希望插入学生信息。这些方案要求,保持一个的SqlTransaction的开放数据原子(意思是你不想改变什么,如果在任何操作失败的数据库)

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,将自动回滚对表格所做的每一项更改

4

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

SqlConnection myCon = new SqlConnection(conStr); 
0

错误消息是如此的清晰;

ConnectionString属性尚未初始化

您可以设置它的ConnectionString propertyconStr的;

myCon.ConnectionString = conStr; 

或者您可以在constructor上指定它作为参数;

SqlConnection myCon = new SqlConnection(conStr); 

正如史蒂夫说的那样;将您的SqlConnection保存为全局变量不是一个好主意。为此使用局部变量,并使用using statement来处置您的连接和命令。

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