【问题标题】:Get all data from a list WCF从列表 WCF 中获取所有数据
【发布时间】:2019-07-30 09:02:44
【问题描述】:

我像这样将一个字符串传递给我的 WCF 服务

http://localhost:49854/Service1.svc/rest/getData/station_number=("31098","31508","31273")

我的 IService:

[OperationContract]
    [WebInvoke(Method = "*" ,ResponseFormat = WebMessageFormat.Json,RequestFormat = WebMessageFormat.Json, UriTemplate = "getData/station_number=({number})")]
    IEnumerable<Data> getData(string number);

然后该字符串将被, 切割成更小的部分,然后添加到一个列表中,之后我将遍历该列表,然后获取与列表成员匹配的数据,如下所示:

public class Service1 : IService1
{
    public IEnumerable<Data> getData(string number)
    {
        string cs = ConfigurationManager.ConnectionStrings["Bokeh_data"].ConnectionString;
        List<string> new_list = new List<string>();
        new_list = number.Split(',').ToList();
        List<Data> data_cont = new List<Data>();
        Data dt = new Data();
        for (var i = 0; i< new_list.Count; i++)
        {
            using (SqlConnection conn = new SqlConnection(cs))
            {
                SqlCommand cmd = new SqlCommand("GetData_byvalue", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@number", SqlDbType.VarChar, 50).Value = new_list[i];
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                while(reader.Read())
                {
                    dt.bike_number = reader["Bike_number"].ToString();
                    dt.start_station = reader["Start_station"].ToString();
                    dt.start_station_num = reader["Start_station_numb"].ToString();
                    data_cont.Add(dt);
                }
            }

        }
        return data_cont;
    }

我的程序:

CREATE PROCEDURE GetData_byvalue(@number nvarchar(50))
AS
BEGIN
 SELECT * FROM data WHERE Start_station_num = @number
END

但我一次只能得到最后一个Start_station_num,例如"31273"(我的表中有所有三个Start_station_num)可能是因为我的循环或我的字符串错误?

这是我从 WCF 得到的: unexpected result

【问题讨论】:

  • 您需要在每次循环迭代中创建一个新的 Data 实例。现在你只是添加相同的。
  • @Crowcoder 你是对的,我太笨了,会犯同样的错误两次

标签: c# loops wcf arraylist


【解决方案1】:

使用下面的函数从你拥有的逗号分隔的 id 中获取行

Create FUNCTION dbo.CSVToNvarcharTable (@InStr NVARCHAR(MAX))
    RETURNS @TempTab TABLE (id NVARCHAR(MAX) NOT NULL)
    AS
    BEGIN
        ; -- Ensure input ends with comma
        SET @InStr = REPLACE(@InStr + ',', ',,', ',');
        DECLARE @SP INT;
        DECLARE @VALUE NVARCHAR(MAX);
        WHILE PATINDEX('%,%', @InStr) <> 0
        BEGIN
            SELECT @SP = PATINDEX('%,%', @InStr);
            SELECT @VALUE = LEFT(@InStr, @SP - 1);
            SELECT @InStr = STUFF(@InStr, 1, @SP, '');
            INSERT INTO @TempTab
            (
                id
            )
            VALUES  (LTRIM(RTRIM(@VALUE))); -- Ensure input don't have trailing 0's
        END;
        RETURN;
    END;

    GO

然后将包含逗号分隔的 id 的字符串传递给 DB

喜欢这个

CREATE PROCEDURE GetData_byvalue(@number nvarchar(50))
AS
BEGIN

 SELECT * FROM data INNER JOIN dbo.CSVToNvarcharTable(@number) AS funcResult
ON Start_station_num =funcResult.id
END

这种方法节省了您每次创建的额外数据库调用和连接,具有成本效益。

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 2021-09-05
    • 1970-01-01
    • 2019-02-22
    • 2016-11-21
    • 2018-10-25
    • 2018-09-17
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多