2012-08-06 60 views
1

我創建了一個查詢來從消息數據庫中選擇一條消息的正文。我不知道如何執行它來獲取正文字符串並將其存儲。我試過使用ExecuteReader,ExecuteScalar和ExecuteNonQuery。他們都沒有工作。 ExecuteScalar與工作最接近,但它只返回第一行消息的正文,而不管您嘗試查看哪一行。有人知道怎麼做嗎?這將是一個簡單的修復。在c#中執行查詢asp.net

SqlCommand com = new SqlCommand("SELECT Body FROM Messages WHERE MessageID=    MessageID", conn); 
    com.Connection = conn; 
    com.Connection.Open(); 
    String body; 
    body = com.ExecuteScalar.ToString; 

這就是我現在所擁有的。提前致謝!

回答

4

查詢中的messageId是什麼?你應該做這樣的事情

SqlCommand com = new SqlCommand("SELECT Body FROM Messages WHERE MessageID = @MessageId"); 
com.Parameters.AddWithValue("@MessageId", 1); //Replace 1 with messageid you want to get 
string s = com.ExecuteScalar().ToString() 
+0

你說的話有很大的意義,但唯一的問題是當我嘗試使用AddParametersWithValue時,我得到:System.Data.SqlClient.SqlCommand不包含AddParmatersWithValue的定義並且沒有擴展方法AddParametersWithValue接受類型System的第一個參數.Data.SqlClient.SqlCommand可以找到。 – Kevin 2012-08-06 23:28:06

+0

我修改了代碼。 – Anuraj 2012-08-07 01:15:46

+0

非常感謝,謝謝! – Kevin 2012-08-08 01:24:38

1

你應該嘗試這樣的事情。

SqlCommand com = new SqlCommand("SELECT Body FROM Messages WHERE MessageID=    MessageID", conn); 
com.Connection = conn; 
com.Connection.Open(); 
String body; 
SqlDataReader dr = com.ExecuteReader(); 
if(dr.HasRows){ 
while(dr.Read()){ 
body+=dr["Body"].ToString(); 
    } 
} 

我希望這對你有用。

+0

感謝您的迴應。不幸的是,它從第一行開始連接每條消息的主體。我想要做的是能夠讓用戶選擇一行,並根據他選擇的行,顯示與該行相對應的消息正文。每一行都有一個唯一的MessageID,這就是我所設想的WHERE MessageID = MessageID所要處理的內容。 MessageID是我數據庫中的一列。右側的MessageID是一個本地c#變量,它保存用戶單擊的行的唯一ID。 – Kevin 2012-08-06 03:02:07

2

可以使用的SqlDataAdapter和DataTable此:

SqlCommand com = new SqlCommand("SELECT MessageID,Body FROM Messages WHERE MessageID=    MessageID", conn); 
SqlDataAdapter dadapter=new SqlDataAdapter(); 
DataTable dt = new DataTable(); 
    com.Connection = conn; 
    com.Connection.Open(); 
    String body; 
    dadapter.SelectCommand=com; 
    dadapter.Fill(dt); 
    body = dr.Rows["Body"].toString(); 
0

根據您的回覆下方Nudier,你想在選定的messageId通過通過使用消息WHERE MessageID = MessageID

這將不起作用的原因,並且您總是得到返回的第一行的原因是,SQL不知道MessageID是您嘗試傳入的變量。正如SQL知道的,MessageID是一個列名,所有y您要求SQL執行的操作是選擇列MessageID =列MessageID所在行的列「Body」,以便MessageID等於它自己,這總是等於true。由於ExecuteScalar總是返回第一行的第一個單元格,因此您的查詢將始終返回Messages表中的所有行,並且executeScalar將抓取第一個單元格。

希望有道理,如果沒有,只需複製您的查詢並將其與您的SQL數據庫相對應,您應該看看我的意思是返回所有行,因爲where子句總是等於true。

要修復它,您需要考慮Anuraj關於添加參數所說的內容。

要傳遞一個變量在代碼中的SQL字符串,則需要對其進行參數化,然後添加相關的參數,所以你的SQL應該成爲:

SELECT Body FROM Messages WHERE [email protected] 

(注意添加@符號的前?參數名稱)

,並直接跌破這一線,則需要使用添加參數代碼:

com.AddParameterWithValue("@MessageId", MessageId); 

(我認爲這是正確的,我從Anuraj複製它,I N ormally做略有不同)

再次,看看這個工作,你可以直接針對與參數數據庫使用

DECLARE @messsageID AS INTEGER 
SET @messageID = 1 
SELECT Body FROM Messages WHERE [email protected] 

運行它有這樣一個閱讀更多的細節(或者,如果我的天堂不可能完全清楚)http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06