2013-07-31 338 views
-1

即时得到这个当执行非查询.. 打电话来的ExecuteNonQuery ....连接属性尚未初始化C#

clsConnection.ExecuteNonQuery("ADD_CUSTOMERS", CommandType.StoredProcedure, paramList); 

例外在cmd.Connection.Open();

弹出,这是整个的ExecuteNonQuery

public static void ExecuteNonQuery(string sql, CommandType type, List<SqlParameter> paramList) 




     try 
     { 
      DataAccess.clsConnection clsDB = new DataAccess.clsConnection(); 
      using (SqlConnection cn =clsDB.OpenCon()) 
      { 
       SqlCommand cmd = new SqlCommand(); 
       cmd = CreateCommand(sql, type, paramList); 
       cmd.Connection = cn; 
       cmd.CommandType = type; 
       cmd.CommandText = sql; 
       cmd.ExecuteNonQuery(); 


      } 
+1

x/y当y始终为0时......除以0 –

+0

+1 @DarrenDavies为什么**是**你在用0除以分数? –

+2

commnet行cmd.Connection.Open();您已经打开连接。尝试cmd.Connection = MainCon; – user2323308

回答

3

你当SqlCommand的执行需要一个打开的连接查询没有连接对象分配到命令

连接。因此,第一步是搜索其连接属性以查看它是否已被初始化。该属性为null,因此你的错误

只需使用

cmd.Connection = MainCon; 

当然修复它,你已经打开的连接,因此你不需要行

cmd.Connection.Open(); 

说,我真的建议你避免以这种方式保留一个全局连接对象。它是性能和对你的程序使用的系统资源的影响,更好地改变OpenCon返回打开连接,并使用using语句来释放资源时,没有更多的需要

namespace DataAccess 
{ 
    public class clsConnection 
    { 
     public SqlConnection OpenCon() 
     {   
       DBN = "PMS"; 
       SERVER = "server-PC\\SQLEXPRESS"; 
       USER = "SA"; 
       PWD = "Sysadmin123"; 

       SqlConnection cn = new SqlConnection("Initial Catalog=" + DBN + ";Data Source=" + SERVER + "; User id =" + USER + "; Password =" + PWD + ";CONNECT Timeout=10"); 
       ..... 
       cn.Open();     
       return cn; 

     }   

    } 
} 

所以您的代码使用该连接可能被更改为

try 
{ 
    DataAccess.clsConnection clsDB = new DataAccess.clsConnection(); 
    using(SqlConnection cn = clsDB.OpenCon()) 
    { 
     SqlCommand cmd = new SqlCommand(); 
     cmd = CreateCommand(sql, type, paramList); 
     cmd.Connection = cn; 
     cmd.CommandType = type; 
     cmd.CommandText = sql; 
     cmd.ExecuteNonQuery(); 

    // Here the closing braces closes and disposes the connection freeing the resources used 
    // also in case of exceptions 
    } 
} 
catch (Exception ex) 
{ 
    .... 
} 

编辑:看下方的评论,增加了更多的上下文的方法OpenCon。我强烈建议你改变你的代码并利用using statement

+0

whern输入cmd.Connection = MainCon; ..弹出错误.. \t非静态字段,方法或属性 需要对象引用..这是该连接对整个系统都有用处。即时通讯只做一部分。无论如何,对于这个建议,它将在未来帮助我 – user2401106

+0

如果包含OpenCon的类与构建命令的类不同,那么您需要实例化该类的一个对象,以便能够使用该类的方法。 (例如'Dim clsCon = new DataAccess.clsConnection',然后clsCon.OpenCon()' – Steve

+0

无法隐式地将类型'void'转换为'System.Data.SqlClient.SqlConnection'出现此错误..当执行此操作时(检查main问题) – user2401106

1

使用Connection Timeout而不是Connect Timeout

+0

'Connect Timeout'在那里是一个有效的值,无论如何,他似乎没有收到关于连接字符串的任何错误。 –

+0

@AndrewBarber我站好了。在 –

+0

之前,从未使用过此关键字可以理解;我必须自己查看才能验证它! –

2

你必须分配给命令

cmd = CreateCommand(sql, type, paramList); 
cmd.Connection = MainCon; 
+0

我试过并得到这个错误。 非静态字段,方法或属性'DataAccess.clsConnection.MainCon'需要对象引用 – user2401106

+0

您的设计存在问题。可能是您可以发布您的DataAccess类代码... –

0

而且我会推荐使用SqlConnectionStringBuilder!

var builder = new SqlConnectionStringBuilder(); 
builder.DataSource = "server-PC\\SQLEXPRESS"; 
builder.InitialCatalog = "PMS"; 
builder.UserID = "SA"; 
builder.Password = "Sysadmin123"; 

using (var connection = new SqlConnection(builder.ToString())) 
{ 
    using (var cmd = new SqlCommand()) 
    { 
     cmd.CommandText = "ADD_CUSTOMERS"; 
     cmd.CommandType = System.Data.CommandType.StoredProcedure; 
     cmd.Connection = connection; 

     connection.Open(); 
     cmd.ExecuteNonQuery(); 
     connection.Close(); 
    } 
} 
相关问题