如何在 C# WCF 中返回 SqlDataReader?

use*_*991 4 c# wcf visual-studio-2010

在我的 C# WCF 服务中,我有一个SqlDataReader包含要返回给客户端的数据行。

如何返回中的所有内容SqlDataReader

现在我有

if (sqlReader != null)
{
    if (sqlReader.HasRows)
    {
        while (sqlReader.Read())
        {
            return sqlReader[0].ToString();
        }
        sqlConn.Close();
    }
    else
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

那只返回第一个结果。目前该类的返回类型是字符串。我在想像 array in array 这样的东西,但我不确定如何?

编辑:

感谢您的众多回复。我有兴趣返回服务“创建”的整个 SQL 数据。不在线第一列 ([0]) - 这仅用于测试。

但我不确定如何将服务中的所有内容返回给客户端。

  • 如何退货?

例如。在 Powershell 中,如果我必须在客户端之间传递它,我会创建一个集合并将对象添加到该集合中。

我在 C# 和 WCF 中寻找类似的东西。

到目前为止非常感谢:)

编辑#2:

知道了!:)

创建了一个新类(例如):

public class ObjectNotification
{
    public string AlertDescription;
    public string Servername; 
}
Run Code Online (Sandbox Code Playgroud)

在我的 svc.cs 文件中:

List<ObjectNotification> objlist = new List<ObjectNotification>();
Run Code Online (Sandbox Code Playgroud)

    if (sqlReader.HasRows)
    {
       while (sqlReader.Read())
       {
             ObjectNotification obj = new ObjectNotification();
             obj.AlertDescription = sqlReader["AlertDescription"].ToString();
             obj.Servername = sqlReader["ComputerName"].ToString();
             objlist.Add(obj);
       }
    }
    return objlist;
Run Code Online (Sandbox Code Playgroud)

这正是我想要的:)

此致

Dam*_*ith 5

您需要定义 DataContract,如果您传递字符串列表或字符串数​​组,您的服务使用者需要知道哪个索引对应哪个列等等。当您将来向服务添加或删除列时,这种方法将很难。您可以做的是创建 DataContract,其中包含您需要发送的所有属性并相应地创建操作合同。现在服务消费者可以在未来更新服务引用,以防更改字段,他们将收到编译器错误。这很容易识别。

public List<MyDataContract>  GetData()
{
    List<MyDataContract> list = new List<MyDataContract>();
    //your code

    if (sqlReader != null)
    {
        if (sqlReader.HasRows)
        {
            while (sqlReader.Read())
            {
                list.Add(new MyDataContract() { 
                    Id = (int)sqlReader["Id"].ToString(), 
                    Name= sqlReader = sqlReader["Name"].ToString() });

            }
            sqlConn.Close();
        }
    }

    //finally return list of data

    return list;
}
Run Code Online (Sandbox Code Playgroud)

示例数据合同

[DataContract]
public class MyDataContract
{
    [DataMember]
    public int Id{ get; set; }

    [DataMember]
    public string Name{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和运营合同

     [OperationContract]
     List<MyDataContract> GetData();
Run Code Online (Sandbox Code Playgroud)

在我看来,我们需要更多通用的可重用代码......

如果您只有 .net 服务消费者,您可以从服务方法返回DataSet 或 DataTable。您需要使用SqlDataAdapter而不是 sqlReader 并填充数据表或数据集并返回它。您可以在服务方法定义中不更改任何数量的列。您甚至可以通过使用将返回类型作为字符串发送DataSet.GetXml()

将数据表转换为 Json

string json = JsonConvert.SerializeObject(table, Formatting.Indented);
Run Code Online (Sandbox Code Playgroud)