Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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_Sql Server_Stored Procedures - Fatal编程技术网

C# “从何处选择”不存在数据时读取的尝试无效

C# “从何处选择”不存在数据时读取的尝试无效,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我试图找到一种使用C执行以下存储过程的方法 ALTER PROCEDURE spLoadClients @NetworkingChannel nvarchar(50) AS SELECT Client_Groups FROM ClientTable WHERE Networking_Channel = (@NetworkingChannel) RETURN 存储过程是正确的。

我试图找到一种使用C执行以下存储过程的方法

ALTER PROCEDURE spLoadClients
    @NetworkingChannel nvarchar(50)
AS
    SELECT       
        Client_Groups
    FROM
        ClientTable
    WHERE        
        Networking_Channel = (@NetworkingChannel)

    RETURN
存储过程是正确的。我只需要找到正确的方法来使用C执行它

以下是我尝试过的:

SqlDataReader reader;
string UpdateCommand = "spLoadClients";

using (SqlConnection sqlConnectionCmdString = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Shawn\Documents\Visual Studio 2010\Projects\Server\database\ClientRegit.mdf;Integrated Security=True;User Instance=True"))
using (SqlCommand sqlCommand = new SqlCommand(UpdateCommand, sqlConnectionCmdString))
{
    sqlCommand.CommandType = CommandType.StoredProcedure;
    sqlCommand.Parameters.Add("@NetworkingChannel", SqlDbType.NVarChar).Value = IntializedNetworks[i];

    sqlConnectionCmdString.Open();

    reader = sqlCommand.ExecuteReader();
    // Data is accessible through the DataReader object here.
    IntializedPostNet[i] = reader[i].ToString(); //trying to add data from reader into an array errors here
    sqlConnectionCmdString.Close();
}
我一直收到一个错误,上面写着

当不存在数据时尝试读取无效

我做错了什么?

您需要在SqlDataReader上调用.Read方法-至少一次,以实际获取数据

此外,与SqlConnection和SqlCommand一样,SqlDataReader也实现IDisposable接口,因此应该真正包装在using块中

因此,将此添加到您的代码中:

sqlConnectionCmdString.Open();

using (reader = sqlCommand.ExecuteReader())
{
    // iterate over the rows returned by the reader
    while (reader.Read()) 
    {
         // Data is accessible through the DataReader object here.
         IntializedPostNet[i] = reader[i].ToString(); //trying to add data from reader into an array errors here
    }

    reader.Close();
}
sqlConnectionCmdString.Close();

与Oledb相比,将读卡器与存储过程一起使用时,可以使用此方法

var list = (from IDataRecord r in reader
                                       select new
                                       {
                                          FieldName1 = (string)r["Network"],
                                          FieldName2 = (string)r["IPAddress"].ToString(),
                                          FieldName3 = (Int32)r["AsPort"],
                                          FieldName4 = (string)r["ThreadLocks"],
                                          FieldName5 = (string)r["GroupBy"]
                                        }).ToList();
当您使用以sql字符串查询作为输入的读取器或Oledb内联查询时,您可以这样编写来读取并添加到对象

 while (objReader.Read())
            {

                //Upon reading Clean Data for fresh search
                cboClientGroup.Items.Clear();
                cboOccupation.Items.Clear();
                cboCompany.Items.Clear();
                cboClientID.Items.Clear();

                //Apply Fresh Search
                cboClientGroup.Items.Add(Convert.ToString(
                    objReader["Client_Groups"]));

                cboOccupation.Items.Add(Convert.ToString(
                    objReader["Occupation"]));

                cboCompany.Items.Add(Convert.ToString(
                    objReader["Company"]));

                cboClientID.Items.Add(Convert.ToString(
                    objReader["ClientID"]));
}

可能的重复我给出了关于我与读卡器之间存在的问题的更深入的信息。我对转换存储过程没有问题,但是当我传递正确的值时,有些地方不正确,读卡器没有返回任何值。是的,我犯了一个错误。已经有一段时间了。请参阅以学习使用reader。简而言之,在reader.Read返回true时设置一个循环,然后使用Getxxx方法在给定的索引reader.GetString0中检索列值。我认为,GetString0将适用于您。如果initializedpostnet是List,您可能会执行以下操作:while reader.Read{initializedpostnet.Addreader.GetString0;}。我认为不应该将我用作GetString中的索引,因为只有当存储过程只返回一行时,它才会起作用。您应该始终读取列0,因为源中只有一列。GetString参数不是行的索引,而是列的索引。好的,我运行了测试过的代码,发生的事情是数组索引元素0被数组中的第二个元素替换,因此,它不是将值添加到数组0中,而是添加到第一个索引0中,同一个值显示两次,并保留其中一个值。它为什么这样做?索引[0]值刚刚放在这里,现在我正在使用for循环,它应该添加到索引[myfirstvalue],索引[mysecondvalue]关于我的InitializedPostnet阵列,我在数据库中遇到了一个问题,networking channel字段有多个相同的值,例如,在我的network channel字段中,我有两行值2,我想获取驻留在channel 2上的所有客户端。读卡器应该能够获取网络通道中channel 2上的所有客户端领域所以我想得到clientA和ClientB,得到client字段中的所有值,其中networking channel字段等于2。这样我就可以看到驻留在通道2上的所有客户端