Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在变量中存储多行_C#_Sql Server_Stored Procedures - Fatal编程技术网

C# 在变量中存储多行

C# 在变量中存储多行,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我在SQL中有一个简单的表(MyEmail),其中包含一些需要发送的电子邮件,例如: ID Email 1 name@yahoo.com 2 something2@yahoo.com 3 name3@google.com 4 something4@yahoo.com 我制作了一个存储过程(GetAddress)来收集它们,以便以后可以将它们存储到变量中: SELECT Email FROM dbo.MyEmai 我需要代码C#部分的帮助: SqlCommand cmd

我在SQL中有一个简单的表(MyEmail),其中包含一些需要发送的电子邮件,例如:

ID  Email
1   name@yahoo.com
2   something2@yahoo.com
3   name3@google.com
4   something4@yahoo.com
我制作了一个存储过程(GetAddress)来收集它们,以便以后可以将它们存储到变量中:

 SELECT  Email
 FROM dbo.MyEmai
我需要代码C#部分的帮助:

SqlCommand cmdMyEmails = new SqlCommand("GetAddress", connection);
cmdMyEmails.CommandType = CommandType.StoredProcedure;
var MyEmails = (string)cmdMyEmails.ExecuteScalar();
这段代码只返回一行,我需要选择表中的所有行并将其存储到MyEmails变量中

我试过这样的方法,但还是不走运:

var MyEmails = (cmdMyEmails.ExecuteReader()).ToString();
有人能帮我吗? 我需要选择所有行并将其存储到MyEmails变量中


提前谢谢

只需使用datatable填充其中的数据和ExecuteReader()

更新

您可以使用SqlDataAdapter填充数据集

DataSet ds = new DataSet();

SqlCommand cmdMyEmails = new SqlCommand("GetAddress", connection);
cmdMyEmails.CommandType = CommandType.StoredProcedure;
SqlDataAdapter sda = new SqlDataAdapter()
sda.SelectCommand = cmd;
sda.Fill(ds);
或者使用读卡器获取数据

SqlCommand cmdMyEmails = new SqlCommand("GetAddress", connection);
cmdMyEmails.CommandType = CommandType.StoredProcedure;
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{ 
   string Emailid =  reader["Email"].ToString(); 
}

只需使用datatable填充其中的数据和ExecuteReader()

更新

您可以使用SqlDataAdapter填充数据集

DataSet ds = new DataSet();

SqlCommand cmdMyEmails = new SqlCommand("GetAddress", connection);
cmdMyEmails.CommandType = CommandType.StoredProcedure;
SqlDataAdapter sda = new SqlDataAdapter()
sda.SelectCommand = cmd;
sda.Fill(ds);
或者使用读卡器获取数据

SqlCommand cmdMyEmails = new SqlCommand("GetAddress", connection);
cmdMyEmails.CommandType = CommandType.StoredProcedure;
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{ 
   string Emailid =  reader["Email"].ToString(); 
}
正如你在这里看到的

var MyEmails=newlist()//I suposse MyEmails是一个电子邮件列表示例
SqlCommand=newsqlcommand(queryString,connection);
SqlDataReader=command.ExecuteReader();
while(reader.Read())
{ 
MyEmails.Add(newemail(){Email=reader[0].ToString()});//例如
}
您可能想使用以下任何一种:

  • reader[0].ToString()//如果您知道第0列是包含电子邮件的列
  • reader[“email”].ToString()//当电子邮件是查询结果的列名时
正如您在本文中看到的

var MyEmails=newlist()//I suposse MyEmails是一个电子邮件列表示例
SqlCommand=newsqlcommand(queryString,connection);
SqlDataReader=command.ExecuteReader();
while(reader.Read())
{ 
MyEmails.Add(newemail(){Email=reader[0].ToString()});//例如
}
您可能想使用以下任何一种:

  • reader[0].ToString()//如果您知道第0列是包含电子邮件的列
  • reader[“email”].ToString()//当电子邮件是查询结果的列名时

只要用这条语句更改您的SQL语句,您就可以将所有地址作为一个单独的值,用“;”分隔,因此,您无需更改一行C代码:

如果您使用的是比SQL Server 2017更早的SQL,则string_agg函数不可用,因此需要使用此技巧(使用XML内置函数):


只需使用此语句更改SQL语句,就可以将所有地址作为一个值来获取,并用“;”分隔,因此,您无需更改一行C代码:

如果您使用的是比SQL Server 2017更早的SQL,则string_agg函数不可用,因此需要使用此技巧(使用XML内置函数):



不要随意尝试,请查看ADO.NET教程。读卡器是将读取结果的读卡器。不是结果本身,而是函数ExecuteScalar=>执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行被忽略。@freej17否,您需要ADO.NET教程和/或课程。你可以在微软的文档网站上找到很多很好的教程。您可以通过同样免费的Visual Studio Dev Essentials访问Pluralsight的课程,为期3个月program@freej17使用Dapper Framework for SQL,只需在Google上搜索
ADO.NET ExecuteReader()
就会作为第一个结果返回,相信我,您再也不会切换到传统的SqlCommand格式了。Dapper是Stackoverflow开发的,只是为了帮助像我们这样的开发人员!不要随意尝试,请查看ADO.NET教程。读卡器是将读取结果的读卡器。不是结果本身,而是函数ExecuteScalar=>执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行被忽略。@freej17否,您需要ADO.NET教程和/或课程。你可以在微软的文档网站上找到很多很好的教程。您可以通过同样免费的Visual Studio Dev Essentials访问Pluralsight的课程,为期3个月program@freej17使用Dapper Framework for SQL,只需在Google上搜索
ADO.NET ExecuteReader()
就会作为第一个结果返回,相信我,您再也不会切换到传统的SqlCommand格式了。Dapper是Stackoverflow开发的,只是为了帮助像我们这样的开发人员!这看起来是最好的解决方案。我还有一个问题。我应该在此代码之前将电子邮件声明为命名空间吗?此代码位于webmethod中。Post MyEmails代码plz。首先想一想你想要MyEmails的目的是什么这看起来是最好的解决方案。我还有一个问题。我应该在此代码之前将电子邮件声明为命名空间吗?此代码位于webmethod中。Post MyEmails代码plz。首先想一想,您希望MyEmails instanceProcedure或函数“GetAddress”需要参数“@Email”,而该参数未提供。我想我需要改变代码毕竟:你能帮我吗@马克Guillot@freej17我已经更改了这两个查询,因此您可以像原始查询一样通过电子邮件获得结果。请再试一次。感谢您的回答:)我使用的是旧版本,所以我尝试了第二个查询。因为@Email,我需要在C#中进行某种代码更改。电子邮件现在是一个输出参数吗?是一个输出列,就像您在原始帖子中显示的查询一样。选择来自dbo的电子邮件。MyEmai@freej17我希望您需要编写代码的唯一区别是将GetAddress上的电子邮件参数的大小扩展为较大的值,如varchar(4000),这样它现在可以包含多个连接在单个字符串上的地址。过程或函数“GetAddress”需要参数“@Email”,没有提供。我想我需要改变代码毕竟:你能帮我吗@马克Guillot@freej17我已更改了两个查询,因此您将
select string_agg(Email, ';') as Email
from dbo.MyEmail
select (select @Email + ';' 
        from dbo.MyEmail
        for xml path('')) as Email