2012-10-24 152 views
0

我需要從數據庫中的字段檢索值。我有使用下面的代碼。但價值checkOrderId(我需要)顯示SQL字符串,而不是數據庫中的值。我不知道它爲什麼這樣做。請有人幫助我嗎?該查詢是否正確地從數據庫檢索數據?

string connectionString = "Data Source = xxyyzz;Initial Catalog = xyz; Integrated Security = True"; 

SqlConnection connection = new SqlConnection(connectionString); 

connection.Open(); 

string tableName = "[GIS].[SecondaryTraffic].[PotentialBackHauls]"; 

string checkOrderId = "Select TOP 1 OrderID From" + tableName + "ORDER BY InsertDate DESC"; 

SqlCommand cmd = new SqlCommand(checkOrderId, connection); 

//cmd.ExecuteNonQuery(); 

OpenPop.Pop3.Pop3Client popConn = new OpenPop.Pop3.Pop3Client(); 
if (orderIdentity == checkOrderId) 
{ 
     popConn.DeleteMessage(messageNumber); 
} 

connection.Close(); 

我是新來的,沒有聲望立即回答我的問題。在大家的幫助下,我得到了這個解決方案...偉大的幫助,比每個人...以下是我的代碼。

string connectionString =「Data Source = EAEDEV; Initial Catalog = GIS; Integrated Security = True」;

    using (SqlConnection connection = new SqlConnection(connectionString)) 
        { 


         connection.Open(); 

         string tableName = "[GIS].[SecondaryTraffic].[PotentialBackHauls]"; 

         string checkOrderId = "Select TOP 1 OrderID From " + tableName + " ORDER BY InsertDate DESC"; 

         SqlCommand cmd = new SqlCommand(checkOrderId, connection); 


         string valueReturned = (string)cmd.ExecuteScalar(); 

         OpenPop.Pop3.Pop3Client popConn = new OpenPop.Pop3.Pop3Client(); 

         if (orderIdentity == valueReturned) 
         { 
          popConn.DeleteMessage(messageNumber); 
         } 

         connection.Close(); 


        } 
+0

您需要執行該命令並檢索結果。請參閱[文檔SqlCommand.ExecuteScalar](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executescalar.aspx)的完整示例 –

+0

或者可以使用DataReader而不是ExecuteNonQueey 。 –

+0

除了別人在說什麼之外,你真的應該把連接包裝在一個使用塊中。 –

回答

1

您可以添加空間查詢

"Select TOP 1 OrderID From " + tableName + " ORDER BY InsertDate DESC"; 

諾塔:我建議你使用AddWithValue method與參數

string checkOrderId = "Select TOP 1 OrderID From @tableName ORDER BY InsertDate DESC"; 
SqlCommand cmd = new SqlCommand(checkOrderId, connection); 
cmd.Parameters.AddWithValue("@tableName", tableName); 

鏈接:http://msdn.microsoft.com/fr-fr/library/system.data.sqlclient.sqlparametercollection.addwithvalue.aspx

+0

這不只是缺少的空間。發佈的代碼不會真正執行查詢。 –

+0

@Candie,謝謝。我會嘗試你的建議。看看它的話,因爲它仍然沒有返回值。 – Maraduarz

+0

我很樂意幫助你Maraduarz –

2

您對checkOrderId設置的結果的期望不正確。在這種情況下,checkOrderId只是執行查詢而不是實際結果。

您需要執行該命令讀取值回:

using (var connection = new SqlConnection(connectionString)) 
using (var comm = new SqlCommand("Select TOP 1 OrderID From [GIS].[SecondaryTraffic].[PotentialBackHauls] ORDER BY InsertDate DESC", connection)) 
{ 
    connection.Open(); 

    object result = comm.ExecuteScalar(); // This is the key bit you were missing. 

    if (result != null) 
    { 
     // You can cast result to something useful 
     int orderId = (int)result; 
    } 
} // Both comm and connection will have Dispose called on them here, no need to Close manually. 

ExecuteScalar在第一個單元格返回值(即,列1行1)作爲一個對象,你可以轉換爲更好的類型(取決於它在結果集模式中的類型)。

如果您需要閱讀多個值,則需要查看ExecuteReader

還有其他方法可以使用輸出參數來做到這一點,但這會污染答案的重點。

+0

+1失蹤的使用塊是我注意到的第一件事。 –

0

你實際上並沒有在任何地方運行你的命令。代替註釋掉的cmd.ExecuteNonQuery,您應該查看ExecuteScalar方法,該方法允許您從查詢中讀回單個結果值 - 這就是您的查詢返回的結果值。

+0

我後來發現了這些差異。 thanx – Maraduarz

0

添加後

int i = (Int32) cmd.ExecuteScalar(); 

SqlCommand cmd = new SqlCommand(checkOrderId, connection); 

那麼變量i將包含訂單ID

0

不,這是不正確的。您正在將變量orderId與您的查詢字符串進行比較。我懷疑這就是你想要做的。我想你最好調用cmd.ExecuteScalar()來檢索實際的OrderID值。正如其他答案所指出的,您的查詢字符串缺少空格。但最重要的是,在代碼中構造SQL查詢是不好的做法。雖然我看不到此代碼存在安全問題,但如果您繼續使用此方法,則可能會編寫易受SQL注入攻擊的代碼。我建議你學會使用參數或LINQ來建立你的查詢。

+0

是的你是對的。我只有在完成上述職位後才意識到這一點。我仍然是新的和學習。謝謝:) – Maraduarz

相關問題