如果我想在不同的表上运行多个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)
非常感谢.
我是新手,有这个问题.我可以使用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替换记录集吗?如果可以,请告诉我代码中的更改?
有人能告诉我这两段代码之间的区别吗?为什么要使用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) 我试图让标题尽可能具体.基本上我在后台工作线程中运行的是现在的一些代码,如下所示:
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的唯一方法吗?任何帮助,将不胜感激!
我意识到我总是按索引返回的顺序读取我的字段(使用常量).所以据我所知,我的代码已经与CommandBehavior.SequentialAccess兼容.
如果我打开它会有任何好处吗?DataReader只是前传,只读是真正的性能增益吗?
我正在玩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) 我正试图从数据库中提取一些二进制数据并将其写入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) 这是场景:
所以我一直在做的是实现我自己的SqlBlobReader.它继承了Stream和IDisposable,在实例化过程中,我们必须提供一个包含查询的SqlCommand,该查询返回一行包含一列,当然这是我们想要流的blob.然后我的C#域对象可以具有Stream类型的属性,该属性返回SqlBlobReader实现.然后,当流式传输到ASP.net MVC等中的FileContentStream时,可以使用此流.
它将立即使用SequentialAccess执行ExecuteReader,以启用来自MSSQL服务器的blob流.这意味着我们必须小心在使用它时尽快处理流,并且在需要时我们总是懒惰地实例化SqlBlobReader,例如在我们的域对象中使用存储库调用.
我的问题是:
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) 我在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)
所以现在我有了这个巨大的结果字符串.我有数据表.必须有一个更好的方法吗?
谢谢.
sqldatareader ×10
c# ×8
sql ×3
.net ×2
sql-server ×2
ado.net ×1
adodb ×1
asynchronous ×1
f# ×1
idatareader ×1
performance ×1
sqlclient ×1
sqlcommand ×1
stream ×1
vb.net ×1
writetofile ×1