我正在使用ADO.Net + C#+ VSTS 2008 + ADO.Net连接到SQL Server 2008 Enterprise.我使用的是几乎相同的模式/示例 - 使用ADO.Net DataReader通过一个条目(行)检索一个条目(行)的数据.
http://msdn.microsoft.com/en-us/library/haa3afyz.aspx
我的问题是,如果我在此示例中设置SqlCommand超时,1.我认为超时适用于我们可以用多长时间来检索一个特定行,而不是整个数据逐条目的总超时环?
BTW:循环我的意思是,
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
Run Code Online (Sandbox Code Playgroud)
2.此超时仅考虑从数据库检索数据条目所需的时间,并且此超时与我们处理每个条目的时间无关(例如,如果我们将超时设置为20秒,如果它需要1第二个从数据库中检索一个数据条目,我的应用程序逻辑需要30秒来操作数据条目,超时将永远不会发生).
正确理解?
我从来没有试过这个 - 所以我不知道我是否会遇到内存问题.
但是SqlDataReader可以读取万亿条记录吗?这一切都是正确的流?我对SQL/TDS协议的内容有点了解.
更新 翻译万亿意味着非常大的数字.我可能应该说十亿或一亿.
我有一个方法("GetDataReader,"让我们称之为)返回一个SqlDataReader.它位于Singleton DataFactory类中,用于维护与数据库的持久连接.
这样做的问题是,在返回之后,DataReader仍然"连接"到我的DataFactory中的Connection对象.所以,我必须确保调用GetDataReader的代码然后在返回的DataReader上调用Close(),否则,它将"锁定"Connection:
已经有一个与此命令关联的打开DataReader,必须先关闭它.
在从GetDataReader发回DataReader之前,如何"分离"DataReader?要么是,要么克隆它并发回克隆?我不想让调用代码总是明确地关闭它.
这里必须有一个最好的做法.
更新:
谢谢各位的意见.最重要的是,我需要失去使用DataReaders并切换到DataTables的习惯.它们更易于管理.
另外,感谢有关连接池的说明.我知道它,但只是没有把两个和两个放在一起,并意识到我正在重新发明轮子.
我正在创建一个自动数据库查询执行队列,这实际上意味着我正在创建一个逐个执行的SQL查询队列.
使用类似于以下的代码执行查询:
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString))
{
cn.Open();
using (SqlCommand cmd = new SqlCommand("SP", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想做的是尽可能多地收集关于执行的信息.花了多长时间.受影响的行数.
最重要的是,如果它失败了,为什么它失败了.
实际上我可以获得有关我希望能够保存的执行的任何信息.
我在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#编写的一个相当大的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是否已启用.确保每次都创建新的连接对象. …
我SqlDataReader从ExecuteDataReader声明中返回了.
我想要的只是:在绑定到网格之前,在数据读取器中更改一些列名.
情况如下:
问题是:如果存储过程中的一列是大写的,并且网格中的相关列是小写的,则网格不会填充.
我有很多基于这种架构的存储过程.其中一些有很多行要显示.因此,我使用数据读取器来提高性能.
我只是一种方法来更改数据读取器的列名称
sqlDataReader阅读器; reader.executedatareadet();
例如,在返回数据读取器后,我有两列(A,B).
我想在将列绑定到网格之前将列更改'A'为'a'(转换为小写)reader.GetName(i)
我希望能够做类似的事情
reader.SetName(i)
Run Code Online (Sandbox Code Playgroud)
但它接缝我们无法更改数据读取器列名称
我有点卡在我写的一些代码上
概述是我正在从SQL数据库中读取一些数据,并希望在表单上的DataGridView中显示它.我已经确认从数据库中返回了数据但不确定为什么没有出现这些数据.我已经从互联网上学到了很多教程,但到目前为止还没有
这是我的代码
Private Sub PopulateGrid()
Dim Con As New SqlClient.SqlConnection
Dim strCon As String = CropTrackMod.strConn
Dim strCommand As String = "select * from customer"
Try
Con.ConnectionString = strCon
Dim Cm As New SqlClient.SqlCommand(strCommand, Con)
Con.Open()
Dim reader As SqlClient.SqlDataReader = Cm.ExecuteReader()
'test to confirm data received
reader.Read()
MsgBox(reader.Item("ContactName"))
DataGridView1.AutoGenerateColumns = True
DataGridView1.DataSource = reader
DataGridView1.Refresh()
Catch ex As Exception
MessageBox.Show(ex.Message, "Error")
Finally
If Con.State = ConnectionState.Open Then
Con.Close()
End If
End Try
End Sub
Run Code Online (Sandbox Code Playgroud)
我也试图实现数据表,但在数据类型上收到转换错误任何帮助将不胜感激
多谢你们
我正在使用SqlDataReader从SQL Server 2012数据库中获取数据:
SqlConnection connection = (SqlConnection)_db.Database.GetDbConnection();
await connection.OpenAsync();
SqlCommand command = new SqlCommand("dbo.[sp_MyStoredPrc] @InputId=1", connection);
var reader = await command.ExecuteReaderAsync();
if (reader.HasRows)
{
while (reader.Read())
{
int? var1 = (int?)reader["Column1Name"];
}
}
Run Code Online (Sandbox Code Playgroud)
int从数据库读取NULL 字段时,该字段
reader["Column1Name"]为空,因此代码在运行时引发InvalidCastException。
我试过了
reader.GetInt32(reader.GetOrdinal("Column1Name"))
Run Code Online (Sandbox Code Playgroud)
但这会引发System.Data.SqlTypes.SqlNullValueException。
我也尝试过
reader.GetSqlInt32(reader.GetOrdinal("Column1Name"))
Run Code Online (Sandbox Code Playgroud)
返回null,但类型SqlInt32不是int?我想要的。
我最终做了
if (!reader.IsDBNull(reader.GetOrdinal("Column1Name")))
int? var1 = (int?)reader["Column1Name"];
Run Code Online (Sandbox Code Playgroud)
哪个有效。
问题:
有没有比调用该IsDBNull方法更简单的方法?
为什么为什么reader["Column1Name"]返回nulldb 而不是db值为NULL且字段为a int?
我正在尝试使用Task.WhenAll执行多个SqlDataReaders.但是等待任务的时候,我得到了
"System.InvalidOperationException:无效操作.连接已关闭".
创建任务:
List<Task<SqlDataReader>> _listTasksDataReader = new List<Task<SqlDataReader>>();
_listTasksDataReader.Add(GetSqlDataReader1(10));
_listTasksDataReader.Add(GetSqlDataReader2(10));
SqlDataReader[] _dataReaders = await Task.WhenAll(_listTasksDataReader);
Run Code Online (Sandbox Code Playgroud)
我的"SqlDataReader"方法:
public Task<SqlDataReader> GetSqlDataReader1(int recordCount)
{
using (var sqlCon = new SqlConnection(ConnectionString))
{
sqlCon.Open();
using (var command = new SqlCommand("sp_GetData", sqlCon))
{
command.Parameters.Clear();
command.Parameters.Add(new SqlParameter("@recordCount", recordCount));
command.CommandType = System.Data.CommandType.StoredProcedure;
return command.ExecuteReaderAsync();
}
}
}
Run Code Online (Sandbox Code Playgroud)
执行Task.WhenAll时我不应该打开数据库连接,还是我错过了什么?
sqldatareader ×10
c# ×8
.net ×3
ado.net ×3
sql-server ×2
async-await ×1
datagridview ×1
datareader ×1
exception ×1
gridview ×1
sqlcommand ×1
statistics ×1
t-sql ×1
vb.net-2010 ×1