当使用“从何处选择”不存在数据时,读取尝试无效

本文关键字:数据 读取 无效 不存在 何处 从何处选择 选择 | 更新日期: 2023-09-27 18:28:17

我正试图找到一种使用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()方法-至少一次,才能实际返回数据。

此外,就像SqlConnectionSqlCommand一样,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"]));
}