2

我创建了一个查询来从消息数据库中选择消息的正文。我不知道如何执行它来取回正文字符串并存储它。我尝试过使用 ExecuteReader、ExecuteScalar 和 ExecuteNonQuery。它们都不起作用。ExecuteScalar 是最接近工作的,但无论您尝试查看哪一行,它都只返回第一行的消息正文。有人知道怎么做吗?这一定很容易解决。

  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

4 回答 4

5

您的查询中的 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()
于 2012-08-06T03:03:47.450 回答
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();
于 2012-08-06T03:12:31.053 回答
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();  
  }
}

我希望这对你有用。

于 2012-08-06T02:45:35.477 回答
0

根据您在下面对 Nudier 的回复,您正在尝试使用WHERE MessageID = MessageID

这不起作用的原因以及您总是返回第一行的原因是 SQL 不知道 MessageID 是您尝试传入的变量。据 SQL 所知,MessageID 是一列名称,所以您要求 SQL 做的就是选择列 MessageID = 列 MessageID 的行的列“Body”,因此 MessageID 等于其自身,这始终等于 true。由于 ExecuteScalar 总是返回第一行的第一个单元格,因此您的查询将始终返回 Messages 表中的所有行,并且 executeScalar 将抓取第一个单元格。

希望这是有道理的,如果没有,只需复制您的查询并针对您的 SQL 数据库运行它,您应该明白我的意思是什么,它返回所有行,因为 where 子句总是等于 true。

要修复它,您需要考虑 Anuraj 所说的关于添加参数的内容。

要将变量传递给代码中的 SQL 字符串,您需要对其进行参数化,然后添加相关参数,因此您的 SQL 应变为:

SELECT Body FROM Messages WHERE MessageID=@MessageID

(注意在参数名称前添加了@符号?)

在该行的正下方,您需要使用以下代码在代码中添加参数:

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

(我想是的,我是从 Anuraj 那里复制过来的,我通常做的方式略有不同)

同样,要查看此操作,您可以使用参数直接针对数据库运行它

DECLARE @messsageID AS INTEGER
SET @messageID = 1
SELECT Body FROM Messages WHERE MessageID=@messageID

阅读此内容以获取更多详细信息(或者如果我还没有完全清楚)http://www.csharp-station.com/Tutorial/AdoDotNet/lesson06

于 2012-08-06T07:47:10.580 回答