2013-07-31 337 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(); 
    } 
} 
相關問題