2011-09-03 197 views
3

試圖做一個記錄集,我只想要一列數據,但這段代碼給了我一個錯誤..我是一個ASP.NET新手,任何人都可以幫助?:System.Data.SqlClient.SqlException:列名無效

System.Data.SqlClient.SqlException: Invalid column name 'CustomerName'.

using (SqlConnection con = new SqlConnection(DB.GetDBConn())) 
{ 
    con.Open(); 
    using (IDataReader dr = DB.GetRS("select CustomerName from Customer where CustomerID=" + Customer.CustomerID, con)) 
    { 
     string CustomerName = "CustomerName";      
    } 
} 

String EncCustomerName = Encrypt(CustomerName.Replace(".", "").Replace("-", ""),"1"); 

問題2:如何綁定數據庫內容的客戶名稱字符串?它似乎是唯一返回「客戶名稱」作爲客戶名稱字符串的值..我希望它返回客戶名稱字符串的數據庫數據。幫助?

建議使用的ExecuteScalar,所以我修改的請求到這個

using (var con = new SqlConnection(DB.GetDBConn())) 
    using (var cmdContrib = new SqlCommand("SELECT CustomerName FROM Customer WHERE CustomerID=" + ThisCustomer.CustomerID, con)) 

    { 

     con.Open(); 
     string CustomerName = cmdContrib.ExecuteScalar(); 
    } 

,我得到這個錯誤: 「字符串客戶名稱= cmdCust.ExecuteScalar();」

CS0266:不能將類型'object'隱式轉換爲'string'。存在明確的轉換(您是否缺少演員?)

+0

嘗試直接在Management Studio中運行查詢「從客戶中選擇CustomerName」。我敢打賭,你會發現某種拼寫錯誤(不要侮辱你的智慧,這種事情會發生)。 – jadarnel27

+0

你是對的,我想的不對。但現在它不會給我動態數據..它將CustomerName作爲CustomerName變量的值返回,但我想從數據庫獲取數據,爲什麼它不返回動態數據? – Wilkins

+0

你明確地將'CustomerName'設置爲「CustomerName」。你需要從'dr'訪問CustomerName列的實際值(類似於'string CustomerName = dr [「CustomerName」];') – jadarnel27

回答

2

要回答你的第二個問題:

// Set it here so you can access it outside the scope of the using statement 
string CustomerName = ""; 

using (SqlConnection con = new SqlConnection(DB.GetDBConn())) 
{ 
    con.Open(); 
    using (IDataReader dr = DB.GetRS("select CustomerName from Customer where CustomerID=" + Customer.CustomerID, con)) 
    { 
     while (dr.Read()) 
      CustomerName = dr["CustomerName"].ToString(); 
     }      
    } 
} 

如果你確定你只能得到一個客戶名稱的結果,使用DataReader是有點矯枉過正。

SqlCommand。的ExecuteScalar例

string CustomerName = ""; 

using (SqlConnection con = new SqlConnection(DB.GetDBConn())) 
{ 

    SqlCommand cmd = new SqlCommand("SELECT CustomerName FROM Customer WHERE CustomerID = " + Customer.CustomerID, con); 
    cmd.CommandType = CommandType.Text; 

    con.Open(); 

    CustomerName = Convert.ToString(cmd.ExecuteScalar()); 

} 

SqlCommand.ExecuteScalar Method

附加信息

的ExecuteScalar返回一個對象,所以你需要返回的值轉換爲適當的類型(在這種情況下,字符串)。

另外,您應該在使用塊之外聲明您的CustomerName值(如我在示例中所做的那樣) - 否則它將被限定爲使用塊並且在其外部不可用。

+0

我應該用什麼來代替,如果我需要的只是一個結果? – Wilkins

+0

我不確定'DB'是什麼,但是你可以使用ADO.NET和'SqlCommand.ExecuteScalar'方法。讓我知道你是否需要一個例子。 – Tim

+0

我找到了一個例子,謝謝..但它仍然給我同樣的錯誤..我會發布新代碼 – Wilkins

0

這意味着CustomerNameCustomerID不是數據庫中的有效列。再次檢查你的表格。

+0

這是一個有效的列名稱,這是事情。 – Wilkins

+0

@Wilkins這些名字中有空白嗎? – adatapost

0
  1. 確保您嘗試連接正確的數據庫。
  2. 請參閱CustomerName列應位於Customer表中。檢查拼寫也
+0

添加您的模式名稱,如dbo.customer。 – Brij

0

嘗試做一個select * from customer where ...並在您的使用datareader語句放置一個斷點。然後在數據讀取器對象上使用快速監視來調查記錄集中公開的列。

或者你可以在選擇的db上運行select語句來確保列名是相同的。

我同意上面的Madhur,你的列名拼寫不正確。或者你沒有連接到正確的數據庫。

希望這有助於

+0

如何將數據庫內容綁定到CustomerName字符串?它似乎是它唯一的返回CustomerName作爲CustomerName字符串的值。我希望它返回CustomerName字符串的數據庫數據 – Wilkins

+1

請參閱上面的jadarnel27的註釋。您需要更改客戶名稱的字符串分配。請使用字符串customername = dr.GetString(dr.GetOrdinal(「CustomerName」));或類似的東西。 – Nabheet

0

首先,調試和檢查的價值:

DB.GetDBConn() 

你會驗證你在程序中,你會以相同的工作室。

我認爲這是db和你的代碼之間的拼寫。

一旦你過去的錯誤,你需要解決這個問題:

{ 
     string CustomerName = "CustomerName";      
    } 

您沒有訪問讀卡器,嘗試某種教程的那些東西。

+0

這是拼寫,但現在是一個新的錯誤,請參閱上文。 – Wilkins

+0

我並沒有真正使用讀者,但我猜測dr [「CustomerName」]會給你一個結果 - 你想用它做什麼? – Decker97

+0

,這給了我一個錯誤 – Wilkins

相關問題