我在Microsoft SQL Server 2005中的存储过程中编写了三个select语句.两个select语句都返回多个记录,select语句的表列表不同.一个选择来自主表的记录,另一个来自子表.在C#代码中,我想获取所有这些记录并将所有数据放在一个对象中.我正在使用SqlDataReader.有可能用它或我应该做别的事情.
我调用SQL Server的方法返回一个DataReader但是因为我需要做什么 - 这是返回DataReader到驻留在页面代码隐藏的调用方法 - 我无法关闭调用SQL的方法的类中的连接服务器.因此,我没有最终或使用块.
处理资源以使类实现的正确方法是IDisposable什么?或者,我应该从调用者明确处置非托管资源(类级别字段)吗?
编辑:我发回datareader因为我需要将特定数据从datareader绑定到listitem控件,所以在调用类(Codebehind页面)中,我这样做:
new ListItem(datareader["dc"]); (along those lines).
Run Code Online (Sandbox Code Playgroud) 我试图用来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) 我一直在尝试尽快从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) 我有一个包含空值的表,我需要使用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时获取.
我怎样才能安全地获得价值?
谢谢.
我正在从.net应用程序调用存储过程,该过程将记录插入数据库.但是,我需要获取我刚刚成功插入的记录列表.
我知道我可以直接从存储过程返回插入的行,但我希望有一种方法可以在C#中以编程方式执行此操作.
是否可以实现SQLDataReader类以实现此功能,即从插入/删除的表中读取?或者是否有其他类可以容纳此请求?
我目前正在使用此方法从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)
但期待更好的方式,因为这种变化将涉及两次类型铸造.
有更好的想法吗?
谢谢!
我在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 ×10
c# ×8
.net ×3
sql ×3
asp.net ×2
dbnull ×1
exception ×1
idisposable ×1
null ×1
performance ×1
t-sql ×1