C# id未从ExecuteOnQuery()返回;
在这里,我需要创建一个DataTable,但它不返回id。没有错误。实际上,这里我提供了一个电子邮件地址(epost)。我需要从数据库返回id 编码部分在这里C# id未从ExecuteOnQuery()返回;,c#,asp.net,vsto,C#,Asp.net,Vsto,在这里,我需要创建一个DataTable,但它不返回id。没有错误。实际上,这里我提供了一个电子邮件地址(epost)。我需要从数据库返回id 编码部分在这里 public string GetAllMails() { DataConnection dc = new DataConnection(); string e=""; int uid=-1,sid=0; DataTable dt = new DataTable(
public string GetAllMails()
{
DataConnection dc = new DataConnection();
string e="";
int uid=-1,sid=0;
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("uid");
dt.Columns.Add("email");
Microsoft.Office.Interop.Outlook.Application oApp;
Microsoft.Office.Interop.Outlook._NameSpace oNS;
Microsoft.Office.Interop.Outlook.MAPIFolder oFolder;
Microsoft.Office.Interop.Outlook._Explorer oExp;
oApp = new Microsoft.Office.Interop.Outlook.Application();
oNS = (Microsoft.Office.Interop.Outlook._NameSpace)oApp.GetNamespace("MAPI");
oFolder = oNS.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
oExp = oFolder.GetExplorer(false);
oNS.Logon(Missing.Value, Missing.Value, false, true);
Microsoft.Office.Interop.Outlook.Items items = oFolder.Items;
SqlConnection conn = dc.SqlConnection;
if (conn.State != ConnectionState.Open) conn.Open();
SqlCommand cmd = new SqlCommand("GetDetailsByEmail", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter();
foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
{
if (mail.UnRead == true)
{
e=mail.SenderEmailAddress;
// param <-- add sql parameters
cmd.Parameters.Add(new SqlParameter("@epost",e));
uid = cmd.ExecuteNonQuery();
//send to db and take the id (uid)
//if returned id
DataRow row = dt.NewRow();
row["id"] = sid;
sid++;
row["uid"] = uid;// uid
row["email"] = e;
dt.Rows.Add(row);
}
}
return e;
}
当我编辑编码时,uid是int
uid = cmd.ExecuteReader(); or uid = cmd.ExecuteScalar(); // it shows me conversion error.here i put as a comment
如果您阅读了有关的文档,您将看到以下行: 对连接执行Transact-SQL语句,并返回受影响的行数 你需要用它来做你想做的事 编辑: 下面是根据您的评论,代码的外观。有点奇怪,您的存储过程返回2列,但您只对1列感兴趣。此外,还不清楚是否需要多行
if (dc.SqlConnection.State != ConnectionState.Open)
dc.SqlConnection.Open();
using (var cmd = new SqlCommand("GetDetailsByEmail", dc.SqlConnection))
{
cmd.CommandType = CommandType.StoredProcedure;
foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
{
if (mail.UnRead)
{
e = mail.SenderEmailAddress;
//this is a little nasty
if (cmd.Parameters.Count > 0)
cmd.Parameters.RemoveAt(0);
cmd.Parameters.AddWithValue("@epost", e);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
uid = reader.GetInt32(0);
DataRow row = dt.NewRow();
row["id"] = sid;
sid++;
row["uid"] = uid;// uid
row["email"] = e;
dt.Rows.Add(row);
}
}
}
}
}
如果您阅读了有关的文档,您将看到以下行: 对连接执行Transact-SQL语句,并返回受影响的行数 你需要用它来做你想做的事 编辑: 下面是根据您的评论,代码的外观。有点奇怪,您的存储过程返回2列,但您只对1列感兴趣。此外,还不清楚是否需要多行
if (dc.SqlConnection.State != ConnectionState.Open)
dc.SqlConnection.Open();
using (var cmd = new SqlCommand("GetDetailsByEmail", dc.SqlConnection))
{
cmd.CommandType = CommandType.StoredProcedure;
foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
{
if (mail.UnRead)
{
e = mail.SenderEmailAddress;
//this is a little nasty
if (cmd.Parameters.Count > 0)
cmd.Parameters.RemoveAt(0);
cmd.Parameters.AddWithValue("@epost", e);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
uid = reader.GetInt32(0);
DataRow row = dt.NewRow();
row["id"] = sid;
sid++;
row["uid"] = uid;// uid
row["email"] = e;
dt.Rows.Add(row);
}
}
}
}
}
ExecuteNonQuery
用于插入、更新、删除。。。不适用于SELECT语句。使用ExecuteReader()代替标题如果查询始终返回一个值,则可以使用;然后它给出了一个错误“当使用cmd.ExecuteScalar()时,无法将类型system.data.sqlclient.sqlreader隐式转换为'int'”@HenkMollema;它告诉我这个错误无法将类型对象隐式转换为int,并且存在显式转换“ExecuteOnQuery
用于插入、更新、删除…而不是用于SELECT语句。使用ExecuteReader()代替读取如果您的查询总是返回一个值,您可以使用。现在我将其更改为uid=cmd.ExecuteReader();然后它会给我错误”当使用cmd.ExecuteScalar()时,无法将类型system.data.sqlclient.sqlreader隐式转换为'int'@HenkMollema;它显示此错误无法将类型对象隐式转换为int,并且存在显式转换“现在我将其更改为uid=cmd.ExecuteReader()”;然后它给我错误“不能隐式地将system.data.sqlclient.sqlreader类型转换为'int'”@JehanPerera我已经根据您的代码用一些示例代码更新了我的答案。我相信你可以用它来解决任何小问题,或者重写它以适应你自己的喜好。谢谢你的代码。那是正确的。但是一件事。当循环运行第一个项目时,没有问题。当将其移动到第二个项目时,它将停止,并显示executereader行,但出现以下异常“过程或函数指定了太多参数”现在我将其更改为uid=cmd.executereader();然后它给我错误“不能隐式地将system.data.sqlclient.sqlreader类型转换为'int'”@JehanPerera我已经根据您的代码用一些示例代码更新了我的答案。我相信你可以用它来解决任何小问题,或者重写它以适应你自己的喜好。谢谢你的代码。那是正确的。但是一件事。当循环运行第一个项目时,没有问题。当将其移动到第二个项目时,它将停止,并显示executereader行,但出现以下异常“过程或函数指定的参数太多”