12

我有这个代码:

public static SqlDataReader GetGeneralInformation ( int RecID )
{
    using ( var conn = new SqlConnection( GetConnectionString() ) )
    using ( var cmd = conn.CreateCommand() )
    {
        conn.Open();
        cmd.CommandText =
        @"SELECT cs.Status, cs.Completed
          FROM NC_Steps s
          INNER JOIN NC_ClientSteps cs
              ON cs.RecID = s.RecID
          WHERE cs.ClientID = 162
          AND s.RecID = @value";
        cmd.Parameters.AddWithValue( "@value", RecID );
        using ( var reader = cmd.ExecuteReader() )
        {
            if ( reader.Read() )
            {
                return reader;
            }
            return null;
        }
    }
}

我如何参考这个?

我试过这个,但它不起作用。

SqlDataReader reader = GeneralFunctions.GetGeneralInformation();

另外,我将如何从读者那里阅读?

Reader.GetString( reader.GetOrdinal( "Status" ) )

编辑

我现在收到以下错误:

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

这是更新的代码:

public static IEnumerable<IDataRecord> GetGeneralInformation ( int ClientID )
{
    using ( var conn = new SqlConnection( GetConnectionString() ) )
    using ( var cmd = conn.CreateCommand() )
    {
        conn.Open();
        cmd.CommandText =
        @"SELECT i.GoLiveDate, i.FirstBonusRun, i.TechFName, i.TechLName, i.TechEmail, i.TechPhone, i.WebISPFName, i.WebISPLName, 
          i.WebISPEmail, i.WebISPPhone, i.FullFillFName, i.FullFillLName, i.FullFillEmail, i.FullFillPhone, d.FName,
          d.LName, d.HomePhone, d.Email
          FROM NC_Information i
          INNER JOIN Distributor d
            ON d.DistID = i.ClientID
          WHERE clientID = @value";
        cmd.Parameters.AddWithValue( "@value", ClientID );
        using ( var reader = cmd.ExecuteReader() )
        {
            while ( reader.Read() )
            {
                yield return reader;
            }
            yield return null;
        }
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    IEnumerable<IDataRecord> reader = GeneralFunctions.GetGeneralInformation( (int)Session[ "DistID" ] );

    //string result = GeneralFunctions.GetGeneralInformation( Globals.GeneralInformation ).First()[ "Status" ].ToString();
}
4

5 回答 5

21

问题是离开函数(通过 return 语句)会把你踢出using块,所以你正在使用的SqlDataReaderSqlConnections你正在使用的被处理掉了。要解决此问题,请尝试更改函数签名,如下所示:

public static IEnumerable<IDataRecord> GetGeneralInformation ( int RecID )

然后像这样更新函数的中间:

using ( var reader = cmd.ExecuteReader() )
{
    while ( reader.Read() )
    {
        yield return reader;
    }
}

对于最后的“我如何从中阅读?” 部分,它可能看起来像这样:

int RecID = 12345;
string result = GetGeneralInformation(RecID).First()["Status"].ToString();
于 2012-04-20T19:45:54.093 回答
6

将您的连接字符串添加到 app.config 或 web.config 中的 AppSettings 部分。

   public string GetSqlConnection()
    {
        return  System.Configuration.ConfigurationManager.AppSettings["SqlConnectionString"];
    }

//返回SqlDataReader结果的函数

    public SqlDataReader executeReader(string sql, SqlParameter[] parameters=null)
    {
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = GetSqlConnection();
        conn.Open();
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = sql;
        if (parameters != null)
        {
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter p in parameters)
            {
                cmd.Parameters.Add(p);
            }
        }
        else
        {
            cmd.CommandType = CommandType.Text;
        }
        SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        return reader;
    }

要使用该功能:

        string query = @"SELECT cs.Status, cs.Completed
      FROM NC_Steps s
      INNER JOIN NC_ClientSteps cs
          ON cs.RecID = s.RecID
      WHERE cs.ClientID = 162
      AND s.RecID = @value";
       //you can add more parameters by adding commas
       var parameters = new SqlParameter[] {
            new SqlParameter("@value", RecID )
           };

        SqlDataReader dr = executeReader(query, parameters);
        while (dr.Read())
        {
            //fill your controls with data 
        }
        dr.Close();
于 2014-02-22T00:19:18.830 回答
1

我相信这个 StackOverflow 答案值得一提。一个非常简单且易于使用的解决方案。

于 2016-10-09T11:23:58.317 回答
0

问题是您正在方法中创建数据库连接。

如果您要在许多方法之间共享数据库资源,请移出SqlConnection此范围。

通过这种方式,您可以从此函数返回 Reader 并且它将持续存在。

另外,不要.Read()在这个函数中,只返回对象。

于 2013-05-11T19:16:32.050 回答
-1

根据定义,using语句应该在调用对象后处理它。

因此,在您退回数据阅读器后,它会被丢弃。

于 2012-04-20T19:47:58.537 回答