我正在开发一个异步获取DataReader的DAL.
我想编写一个方法将DataReader转换为DataSet.它需要处理不同的模式,以便这一个方法将处理我的所有提取需求.
PS我正在异步填充SQLDataReader,请不要给出摆脱DataReader的答案.
好的,我在本周早些时候就这个错误提出了问题并得到了一些非常有用的答案,毫无疑问,自从我开始遵循这些建议后,情况有了很大改善.
但是,现在我使用'正确',最佳实践方法来访问数据库我仍然在某些函数上得到此错误,我不能让它为该块消失.这是我的代码:
Public Shared Function doesBasketExist(ByVal baskethash As String) As Boolean
Dim _r As Boolean
Using db As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("pitstopConnectionString").ConnectionString)
Using cmd As New SqlCommand("doGetBasketByHash", db)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@baskethash", baskethash)
Using dr As SqlDataReader = cmd.ExecuteReader()
If dr.HasRows() = True Then
_r = True
Else
_r = False
End If
dr.Close()
End Using
End Using
End Using
Return _r
End Function
Run Code Online (Sandbox Code Playgroud)
现在无论我做什么,我都会得到:ExecuteReader需要一个开放且可用的连接.连接的当前状态已关闭.在这个连接上.我确实在这个类中有与对象相同的函数(cmd,dr等),但是使用后自动关闭它不是吗?
建议欢迎:)
我从配置文件中获得了一个SQL查询,这个查询通常包含3-6个连接.
我需要在运行时根据SqlDataReader表示的结果集找到每个列的表名.
以下是一些不起作用的东西:
我在控制台应用程序中使用.net 3.5SP1/C#/ SQL Server 2008.
编辑:我知道这对所有情况都不可能,因为"列"可以从多个表,一个函数甚至一个常量表达式组合 - 我正在寻找一些在简单情况下有用的东西.
编辑2:找出它无法工作的原因 - 您可以使用SqlDataReader.GetSchemaTable获取表信息,但是您必须将CommandBehavior设置为KeyInfo,您可以在ExecuteReader调用中执行此操作:
reader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
Run Code Online (Sandbox Code Playgroud) 我只是想知道,在使用DataReader和DataAdapter从数据库中获取数据时我需要考虑哪些事情,而另外两个之间的区别是datareader需要打开连接而datadapter不需要...在我们的项目中,使用DataReader我们所有的DAL,我们从不使用dataadapter.所以我想知道使用DataAdapter + Datatable组合比使用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)
所以现在我有了这个巨大的结果字符串.我有数据表.必须有一个更好的方法吗?
谢谢.
我有一个简单的方法,从DataReader而不是内置的GetInt32返回Nullable Int32.
我多次称这种方法有一种情况,任何时候我都可以剃掉它会有益.
任何人都可以建议任何替代和更快的方式从DataReader中获取可以为空的Int32吗?
private Int32? GetNullableInt32(SqlDataReader dataReader, int fieldIndex)
{
return !dataReader.IsDBNull(fieldIndex) ?
dataReader.GetInt32(fieldIndex) : (Int32?)null;
}
Run Code Online (Sandbox Code Playgroud) 我一直在尝试尽快从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) 使用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) 我的asp.net webapp中有sql查询,结果存储在datareader中.datareader中的每一行包含10列.我想用这些数据填充表格.但是,我不知道如何遍历datareader中的列.我需要这样的东西:
while (vysledky.Read())
{
TableRow row = new TableRow();
tab.Controls.Add(row);
foreach (column in ((datareader(row))) //it is not real code
{
TableCell cell = new TableCell();
cell.Text = datareader(row).content;
row.Controls.Add(cell);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望你明白这一点.谢谢
我正在做一个简单的SQL查询来获取大量数据.查询的复杂性不是问题.执行大约需要200ms.但是,数据量似乎是个问题.
我们检索大约40k行.每行有8列,每行数据量约为几百千字节.比如说,我们为此查询共下载15megs.
让我难以置信的是:当我从一个基本的C#代码执行查询时,需要1分钟和44秒.但是当我从SSMS做到它需要10秒.当然我是从同一台机器上做的,而且我使用的是同一个数据库.我清楚地看到UI和实时填充的行.在10secs中,整个数据表已满.
我们尝试了:
它没有改变任何东西.有道理:它的读取速度很慢.不是查询(恕我直言).
这while(reader.Read())需要时间.而且,我们尝试了一个空的while循环.所以这不包括装箱/拆箱的东西或将结果放在内存中.
这是一个测试程序,我们弄清楚它是Read()需要时间:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Transactions;
namespace SqlPerfTest
{
class Program
{
const int GroupId = 1234;
static readonly DateTime DateBegin = new DateTime(2017, 6, 19, 0, 0, 0, DateTimeKind.Utc);
static readonly DateTime DateEnd = new DateTime(2017, 10, 20, 0, 0, 0, DateTimeKind.Utc);
const string ConnectionString = "CENSORED";
static void Main(string[] args)
{
TransactionOptions transactionOptions = new TransactionOptions
{
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
}; …Run Code Online (Sandbox Code Playgroud) sqldatareader ×10
c# ×7
performance ×3
sql ×3
.net ×2
asp.net ×2
sql-server ×2
ado.net ×1
dataset ×1
nullable ×1
ssms ×1
writetofile ×1