标签: sqldatareader

如果我在存储过程中有多个select语句,如何使用SqlDataReader

我在Microsoft SQL Server 2005中的存储过程中编写了三个select语句.两个select语句都返回多个记录,select语句的表列表不同.一个选择来自主表的记录,另一个来自子表.在C#代码中,我想获取所有这些记录并将所有数据放在一个对象中.我正在使用SqlDataReader.有可能用它或我应该做别的事情.

stored-procedures sqldatareader multiple-select

7
推荐指数
1
解决办法
1万
查看次数

我应该在这里实现IDisposable吗?

我调用SQL Server的方法返回一个DataReader但是因为我需要做什么 - 这是返回DataReader到驻留在页面代码隐藏的调用方法 - 我无法关闭调用SQL的方法的类中的连接服务器.因此,我没有最终或使用块.

处理资源以使类实现的正确方法是IDisposable什么?或者,我应该从调用者明确处置非托管资源(类级别字段)吗?

编辑:我发回datareader因为我需要将特定数据从datareader绑定到listitem控件,所以在调用类(Codebehind页面)中,我这样做:

 new ListItem(datareader["dc"]); (along those lines).
Run Code Online (Sandbox Code Playgroud)

.net c# idisposable sqldatareader

7
推荐指数
1
解决办法
843
查看次数

无法将方法组'Read'转换为非委托类型'bool'

我试图用来SqlDataReader检查条目是否存在.如果它存在,它将返回ID,否则它将返回false.当我尝试编译时,我收到错误"无法将方法组'读'转换为非委托类型'bool'.我一直在关注我在VB中找到的示例,但似乎翻译可能不正确.

private string checkProfileExists()
{
    string strReturn = "False";
    string strSql = ("SELECT ID FROM tblInformation WHERE txtUsername=@UserName " + 
        "AND TrackingID=@TrackingID");
    string strConn = ConfigurationManager.ConnectionStrings["WEM_PassWord_Reset"].
        ConnectionString;


    SqlConnection objConn = new SqlConnection(strConn);
    SqlCommand objCmd = new SqlCommand(strSql, objConn);

    objCmd.Parameters.AddWithValue("@Username", txtUsername.Text);
    objCmd.Parameters.AddWithValue("@TrackingID", txtTrackingID.Text);

    try
    {
        objConn.Open();
        System.Data.SqlClient.SqlDataReader rdr = objCmd.ExecuteReader();

        if (rdr.Read)
        {
            strReturn = rdr("ID").ToString;
        }
        else
        {
            strReturn = "False";
        }
    }
    catch (Exception ex)
    {
        lblErrorMessage.Text = ex.ToString();
    }
    finally
    {
        objConn.Close();
        objCmd = null;
    } …
Run Code Online (Sandbox Code Playgroud)

c# sql sqldatareader

7
推荐指数
2
解决办法
3万
查看次数

SqlDataReader性能列表<string []>或List <object []>

我一直在尝试尽快从SQL服务器读取数据的方法,我遇到了一个有趣的发现.如果我将数据读入List<object[]>而不是a List<string[]>,则性能会提高一倍以上.

我怀疑这是因为不必ToString()在字段上调用方法,但我一直认为使用对象会对性能产生负面影响.

有没有理由不使用对象数组列表而不是字符串数组?

编辑:我只想到了这个数据的存储大小.将数据存储在对象数组中会比字符串占用更多空间吗?

这是我的测试代码:

private void executeSqlObject()
    {
        List<object[]> list = new List<object[]>();

        using (SqlConnection cnn = new SqlConnection(_cnnString))
        {
            cnn.Open();
            SqlCommand cmd = new SqlCommand("select * from test_table", cnn);

            SqlDataReader reader = cmd.ExecuteReader();

            int fieldCount = reader.FieldCount;

            while (reader.Read())
            {
                object[] row = new object[fieldCount];

                for (int i = 0; i < fieldCount; i++)
                {
                    row[i] = reader[i];
                }
                list.Add(row);
            }
        }
    }

    private void executeSqlString()
    {
        List<string[]> list = new List<string[]>(); …
Run Code Online (Sandbox Code Playgroud)

c# performance sqldatareader

7
推荐指数
1
解决办法
2867
查看次数

使用SqlDataReader时如何获取存储过程的返回值?

使用datareader时是否无法获得存储过程的返回值?返回值始终为null,但SP从SSMS中返回有效的int.

myCommand.CommandText = "GetVenueVideos";
SqlParameter retVal = new SqlParameter("@returnValue",SqlDbType.Int);
retVal.Direction = ParameterDirection.ReturnValue;
myCommand.Parameters.Add(retVal);
myReader = myCommand.ExecuteReader();
if (myReader.Read() && myReader.HasRows)
{
    int returnValue = Convert.ToInt32(retVal.Value);
    //returnValue is null at this point
}
Run Code Online (Sandbox Code Playgroud)

.net sql asp.net sqldatareader

7
推荐指数
1
解决办法
1万
查看次数

如何安全地将可空结果从sqlreader转换为int?

我有一个包含空值的表,我需要使用SqlDataReader从表中获取数据.我无法弄清楚如何安全地将DBNull强制转换为int.

我现在正以这种方式做到这一点:

...
reader = command.ExecuteReader();
while (reader.Read()) {
     int y = (reader["PublicationYear"] != null) ? Convert.ToInt32(reader["PublicationYear"]) : 0;
     ...
}
...
Run Code Online (Sandbox Code Playgroud)

但是Object cannot be cast from DBNull to other types.当PublicationYear为null时获取.

我怎样才能安全地获得价值?

谢谢.

c# asp.net null dbnull sqldatareader

7
推荐指数
1
解决办法
1万
查看次数

使用SQL DataReader捕获插入或删除的值

我正在从.net应用程序调用存储过程,该过程将记录插入数据库.但是,我需要获取我刚刚成功插入的记录列表.

我知道我可以直接从存储过程返回插入的行,但我希望有一种方法可以在C#中以编程方式执行此操作.

是否可以实现SQLDataReader类以实现此功能,即从插入/删除的表中读取?或者是否有其他类可以容纳此请求?

.net c# sql stored-procedures sqldatareader

7
推荐指数
1
解决办法
999
查看次数

从DataReader读取数据的通用方法

我目前正在使用此方法从DataReader读取数据 -

private T GetValue<T>(object obj)
{
    if (typeof(DBNull) != obj.GetType())
    {
        return (T)obj;
    }
    return default(T);
}
Run Code Online (Sandbox Code Playgroud)

将上述方法称为 -

GetValue<int>(dataReader["columnName1"])
GetValue<string>(dataReader["columnName2"])
GetValue<float>(dataReader["columnName3"])
Run Code Online (Sandbox Code Playgroud)

但是,当columnName3具有7200000与错误一样的值时,这会失败
Invalid Cast Exception.

我正在考虑修改我的替换方法 -

return (T)obj;
Run Code Online (Sandbox Code Playgroud)

return (T)Convert.ChangeType(obj, typeof(T));
Run Code Online (Sandbox Code Playgroud)

但期待更好的方式,因为这种变化将涉及两次类型铸造.
有更好的想法吗?

谢谢!

c# sqldatareader

7
推荐指数
2
解决办法
7418
查看次数

SqlDataReader从SQL Server 2008读取一些数据类型?

我在asp.net/c#程序中使用SQL Server 2008.我试图使用SqlDataReader从数据库中获取数据,但我不知道如何使用数据类型"bit".

//these are the assemblies i added manually
using System.Web.Script.Services;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

SqlConnection conn2 = new SqlConnection(ConfigurationManager.ConnectionStrings["ucsConnectionString"].ConnectionString);
SqlDataReader rdr2 = null;
conn2.Open();

SqlCommand cmder = new SqlCommand("usp_Device_GetBy_DeviceID", conn2);
cmder.Parameters.AddWithValue("@ID", id);
cmder.CommandType = CommandType.StoredProcedure;
rdr2 = cmder.ExecuteReader();
rdr2.Read();

*insert datatype & var* = rdr2.GetSqlBit(rdr2.GetOrdinal("Line_Name"));
Run Code Online (Sandbox Code Playgroud)

我发现有几个网站引用了上面的"GetSqlBit",但显然它不是我正在使用的程序集的一部分.有什么建议我如何从SQL读取这个"位"数据类型?

我使用"GetSqlBinary"找到了类似的数据类型,但我不完全了解它是如何工作的,或者它是否适合这种情况?

每个人的持续帮助表示赞赏!

c# stored-procedures sqldatareader sql-server-2008

6
推荐指数
2
解决办法
2万
查看次数

'ExecuteReader需要一个开放且可用的连接.连接的当前状态是打开的'

用C#编写的一个相当大的Web应用程序不断抛出2个错误:

'ExecuteReader需要一个开放且可用的连接.连接的当前状态是打开的.并且'读取器关闭时无效尝试调用读取.'

这些错误是偶然的 - 用于在95%的时间内加载精细的页面,但最近它们变得流行,它们一直在发生并且基本上削弱了应用程序的功能.

Web应用程序高度依赖于MS SQL数据库,并且错误似乎不仅限于一个页面,而是几乎所有连接到数据库的页面.

查询按如下方式执行:

Database.Open(); // Custom class that has our connection string hard coded.

string query = "SELECT * FROM table"; // (dummy query)
SqlCommand command = new SqlCommand(query, Database.Conn);

SqlDataReader reader = null;

try {
    reader = command.ExecuteReader(CommandBehaviour.CloseConnection);

    if (reader.HasRows) {

        while (reader.Read()) {
            // Do something with the data.
        }
   }
    reader.Close();
}
catch (Exception e) {
    throw new Exception(e.Message);
}
finally {
    if (reader != null) {
        reader.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在网上研究过这些错误,并且我已经看到了一些我试过无用的潜在解决方案:

将代码的各个部分放在using()块中.为阅读器指定CommandBehaviour.CloseConnection.检查MARS是否已启用.确保每次都创建新的连接对象. …

c# t-sql exception sqldatareader

6
推荐指数
2
解决办法
1万
查看次数