标签: sqldatareader

重用SqlConnection和SqlDataReader

如果我想在不同的表上运行多个SELECT查询,我可以为所有这些表使用相同的SqlDataReader和SqlConnection吗?以下是明智的吗?(我输入的速度很快,所以缺少try/catch):

MySqlCommand myCommand = new MySqlCommand("SELECT * FROM table1", myConnection);

myConnection.Open();
SqlDataReader myDataReader = myCommand.ExecuteReader();

while(myReader.Read())
{
    //Perform work.
}

myCommand.commandText = "SELECT * FROM table2";

myReader = myCommand.ExecuteReader();

while(myReader.Read())
{
    //Perform more work
}

myReader.Close();
myConnection.Close();
Run Code Online (Sandbox Code Playgroud)

非常感谢.

.net c# sqldatareader

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

检查它是否是sqldatareader中的最后一条记录

有没有办法检查我是否在最后一张唱片上?谢谢

c# sql sqldatareader

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

使用SQLDataReader而不是记录集

我是新手,有这个问题.我可以使用SQLDataReader而不是Recordset.我想在SQLDataReader中实现以下结果.

Dim dbConn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim sqlstr As String = "SELECT Name,Status FROM table1 WHERE id=" + item_id.Value.ToString
rs.Open(SQL, dbConn)
While Not rs.EOF
   txtName.Text = rs.Fields.Item("Name").Value
   ddlstatus.SelectedIndex = 1
   rs.MoveNext()
End While
rs.Close()
rs = Nothing
dbConn.Close()
dbConn = Nothing
Run Code Online (Sandbox Code Playgroud)

我可以用SQLDataReader替换记录集吗?如果可以,请告诉我代码中的更改?

vb.net adodb sqldatareader

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

c#IDataReader与SqlDataReader的区别

有人能告诉我这两段代码之间的区别吗?为什么要使用IDataReader?

using (IDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        // get data from the reader
    }
}

using (SqlDataReader reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        // get data from the reader
    }
}
Run Code Online (Sandbox Code Playgroud)

c# sqldatareader idatareader

10
推荐指数
1
解决办法
6332
查看次数

如何对可以取消的DataTable操作执行SQL查询

我试图让标题尽可能具体.基本上我在后台工作线程中运行的是现在的一些代码,如下所示:

 SqlConnection conn = new SqlConnection(connstring);
                    SqlCommand cmd = new SqlCommand(query, conn);
                    conn.Open();
                    SqlDataAdapter sda = new SqlDataAdapter(cmd);
                    sda.Fill(Results);
                    conn.Close();
                    sda.Dispose();
Run Code Online (Sandbox Code Playgroud)

其中query是表示大量耗时查询的字符串,conn是连接对象.

我现在的问题是我需要一个停止按钮.我已经意识到杀死背景工作者将毫无价值,因为我仍然希望在取消查询后保留结果.此外,在查询之后,它将无法检查已取消的状态.

到目前为止我想出的是:

我一直试图概念化如何有效地处理这个问题,而不会影响太大的性能.

我的想法是使用SqlDataReader一次从查询片段中读取数据,以便我有一个"循环"来检查我可以通过按钮从GUI设置的标志.问题是据我所知,我不能使用数据表的Load()方法,仍然能够取消sqlcommand.如果我错了请告诉我,因为这会使取消稍微容易一些.

根据我发现的内容,我实现了,如果我执行类似下面的操作(伪代码),我可能只能取消sqlcommand mid-query:

while(reader.Read())
{
 //check flag status
 //if it is set to 'kill' fire off the kill thread

 //otherwise populate the datatable with what was read
}
Run Code Online (Sandbox Code Playgroud)

然而,在我看来,这将是非常无效的,并且可能代价高昂.这是杀死正在进行的绝对需要在数据表中的sqlcommand的唯一方法吗?任何帮助,将不胜感激!

c# sql sql-server sqlcommand sqldatareader

10
推荐指数
1
解决办法
1446
查看次数

CommandBehavior.SequentialAccess是否有任何性能提升?

我意识到我总是按索引返回的顺序读取我的字段(使用常量).所以据我所知,我的代码已经与CommandBehavior.SequentialAccess兼容.

如果我打开它会有任何好处吗?DataReader只是前传,只读是真正的性能增益吗?

c# sql-server performance ado.net sqldatareader

10
推荐指数
2
解决办法
3517
查看次数

'while'在异步计算表达式中,条件是异步的

我正在玩F#中使用SqlClient而且我在使用时遇到了困难SqlDataReader.ReadAsync.我正在尝试做F#等价的

while (await reader.ReadAsync) { ... }

在F#中做到这一点的最佳方法是什么?以下是我的完整计划.它有效,但我想知道是否有更好的方法来做到这一点.

open System
open System.Data.SqlClient
open System.Threading.Tasks

let connectionString = "Server=.;Integrated Security=SSPI"

module Async =
    let AwaitVoidTask : (Task -> Async<unit>) =
        Async.AwaitIAsyncResult >> Async.Ignore

    // QUESTION: Is this idiomatic F#? Is there a more generally-used way of doing this?
    let rec While (predicateFn : unit -> Async<bool>) (action : unit -> unit) : Async<unit> = 
        async {
            let! b = predicateFn()
            match b with
                | true -> action(); do! While …
Run Code Online (Sandbox Code Playgroud)

f# asynchronous sqldatareader sqlclient

10
推荐指数
1
解决办法
572
查看次数

超时异常导致SqlDataReader关闭?

我正试图从数据库中提取一些二进制数据并将其写入pdf文件.在大多数情况下,这是在游泳,但偶尔的数据行似乎抛出一个特定的错误 -

超时已过期.操作完成之前经过的超时时间或服务器没有响应.

请记住,这只发生在少数行上,并且从不随机.相同的行总是抛出异常.我不确定为什么会抛出异常,但我可以跳过导致问题并继续前进的行.然而,我的问题是,当我捕获异常然后尝试移动到下一行时,我遇到另一个异常 -

InvalidOperationException - 读取器关闭时无效尝试调用Read.

这是否意味着读者一旦遇到异常就会自动关闭?如何在没有任何戏剧的情况下继续前进到下一行?

        while (sdrReader.Read()) // Second exception happens here
        {
            try
            {
                byte[] byteData = new Byte[(sdrReader.GetBytes(0, 0, null, 0, int.MaxValue))]; // first exception happens here
                sdrReader.GetBytes(0, 0, byteData, 0, byteData.Length);
                string strOutputFileName = sdrReader.GetInt32(1).ToString() + ".pdf";
                msMemoryStreams = new MemoryStream();
                msMemoryStreams.Write(byteData, 0, byteData.Length);
                byte[] byteArray = msMemoryStreams.ToArray();

                msMemoryStreams.Flush();
                msMemoryStreams.Close();

                writeByteArrayToFile(byteData, txtFilesPath.Text + "\\" + strOutputFileName);
            }
            catch (Exception e)
            {
                Logger.Write("Document failed to convert: " + e.Message);
            }
        }
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪,根据要求 -

   at …
Run Code Online (Sandbox Code Playgroud)

c# sql sqldatareader

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

在使用SqlDataReader时,如何在普通的旧C#对象中使用BLOB创建流?

这是场景:

  • 我们在MSSQL数据库中的blob中存储文件,例如相对较大的文档(10-300MB).
  • 我们有一个非常小的域模型,所以我们使用干净的SqlDataReader方法为我们的存储库而不是ORM,以避免不必要的依赖.
  • 我们希望在ASP.NET/ASP.NET MVC网页上使用服务器上下文中的对象.
  • 我们不想在byte []中临时存储blob,以避免服务器上的高内存使用

所以我一直在做的是实现我自己的SqlBlobReader.它继承了Stream和IDisposable,在实例化过程中,我们必须提供一个包含查询的SqlCommand,该查询返回一行包含一列,当然这是我们想要流的blob.然后我的C#域对象可以具有Stream类型的属性,该属性返回SqlBlobReader实现.然后,当流式传输到ASP.net MVC等中的FileContentStream时,可以使用此流.

它将立即使用SequentialAccess执行ExecuteReader,以启用来自MSSQL服务器的blob流.这意味着我们必须小心在使用它时尽快处理流,并且在需要时我们总是懒惰地实例化SqlBlobReader,例如在我们的域对象中使用存储库调用.

我的问题是:

  • 当使用SqlDataReader而不是ORM时,这是在普通旧域对象上实现blob流的聪明方法吗?
  • 我不是ADO.NET专家,实现看起来合理吗?

SqlBlobReader.cs:

using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;

namespace Foo
{
   /// <summary>
   /// There must be a SqlConnection that works inside the SqlCommand. Remember to dispose of the object after usage.
   /// </summary>
   public class SqlBlobReader : Stream
   {
      private readonly SqlCommand command;
      private readonly SqlDataReader dataReader;
      private bool disposed = false;
      private long currentPosition = 0;

      /// <summary>
      /// Constructor
      /// </summary>
      /// <param …
Run Code Online (Sandbox Code Playgroud)

.net c# sqldatareader stream

9
推荐指数
1
解决办法
3848
查看次数

如何在c#中有效地从SQL datareader写入文件?

我在C#中有一个远程sql连接,需要执行查询并将其结果保存到用户的本地硬盘.这个东西可以返回相当大量的数据,因此需要考虑一种有效的存储方式.我之前已经读过,先将整个结果放入记忆中,然后写出来并不是一个好主意,所以如果有人可以提供帮助,那就太好了!

我目前正在将sql结果数据存储到DataTable中,虽然我认为它可以更好地做一些事情while(myReader.Read(){...} 下面是得到结果的代码:

          DataTable t = new DataTable();
            string myQuery = QueryLoader.ReadQueryFromFileWithBdateEdate(@"Resources\qrs\qryssysblo.q", newdate, newdate);
            using (SqlDataAdapter a = new SqlDataAdapter(myQuery, sqlconn.myConnection))
            {
                a.Fill(t);
            }

            var result = string.Empty;
    for(int i = 0; i < t.Rows.Count; i++)
    {
        for (int j = 0; j < t.Columns.Count; j++)
        {
            result += t.Rows[i][j] + ",";
        }


        result += "\r\n";
    }
Run Code Online (Sandbox Code Playgroud)

所以现在我有了这个巨大的结果字符串.我有数据表.必须有一个更好的方法吗?

谢谢.

c# sqldatareader writetofile

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