我试图通过迭代读取器获得返回的行数.但是当我运行这段代码时,我总是得到1?我搞砸了吗?
int count = 0;
if (reader.HasRows)
{
while (reader.Read())
{
count++;
rep.DataSource = reader;
rep.DataBind();
}
}
resultsnolabel.Text += " " + String.Format("{0}", count) + " Results";
Run Code Online (Sandbox Code Playgroud) 我正在使用简单查询从数据库中检索用户信息.
select * from dbo.[User] u where u.Email = @email
Run Code Online (Sandbox Code Playgroud)
然后我尝试获取一个名为IsConfirmed的列的值(在数据库中表示为位类型列)并将其转换为bool.
bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1;
Run Code Online (Sandbox Code Playgroud)
然后我得到一个FormatException错误,指出"输入字符串的格式不正确.".
我看到一个类似的问题,答案提供了这段代码:
bool isConfirmed = sqlDataReader.GetBoolean(0);
Run Code Online (Sandbox Code Playgroud)
但这对我的情况不起作用,因为我不知道IsConfirmed列的索引,我不想知道它.我想使用列名.
我的SQL Server数据库包含可为空的DateTime值.如何在C#中的应用程序中将它们转换为可以为空的DateTime对象?
这是我认为它会是什么样子,但它没有:
DateTime? dt = (DateTime?) sqldatareader[0];
Run Code Online (Sandbox Code Playgroud) 从DataReaderI 返回数据时,通常会使用序号引用DataReader来获取相关列:
if (dr.HasRows)
Console.WriteLine(dr[0].ToString());
Run Code Online (Sandbox Code Playgroud)
要么
if (dr.HasRows)
Console.WriteLine(dr.GetString(0));
Run Code Online (Sandbox Code Playgroud)
要么
if (dr.HasRows)
Console.WriteLine((string)dr[0]);
Run Code Online (Sandbox Code Playgroud)
我一直这样做是因为我在早期阶段被告知使用dr["ColumnName"]或更优雅的索引方式会导致性能下降.
然而,尽管对数据实体的所有引用都变得越来越强烈,但我对此感到更加不安.我也知道上面没有检查DBNull.
从数据库中返回数据最有效的方法是DataReader什么?
在C#中,使用SqlDataReader,有没有办法从DB读取布尔值?
while (reader.Read())
{
destPath = reader["destination_path"].ToString();
destFile = reader["destination_file"].ToString();
createDir = reader["create_directory"].ToString();
deleteExisting = Convert.ToBoolean(reader["delete_existing"]);
skipIFolderDate = reader["skipifolderdate"].ToString();
useTempFile = reader["useTempFile"].ToString();
password = reader["password"].ToString();
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,delete_existing在DB中始终为1或0.我在MSDN上读到,Convert.ToBoolean()不接受1或0作为有效输入.它只接受真或假.有没有其他方法将DB值转换为bool?或者我是否需要在SqlDataReader之外执行此操作?
另外,我无法更改数据库值,所以请不要回答"将数据库值从1和0更改为true和false".
谢谢!
我似乎在我的代码中写了这么多:
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
result = new User((int)reader["UserId"], reader["UserName"].ToString());
}
if (reader.Read())
{
throw new DataException("multiple rows returned from query");
}
}
Run Code Online (Sandbox Code Playgroud)
有一些内置的方法可以做到这一点我不知道吗?
dr.Read();如果条件满足,如何从头开始重读?就像是:
SqlDataReader dr = command.ExecuteReader();
for(int i=0; dr.Read() ; i++){
if(condition ){
//let dr.Read() start reading from the beginning
}
}
Run Code Online (Sandbox Code Playgroud) 使用ASP.NET MVC和C#,如何将一些数据库记录传递给View并以表格形式显示它们?
我需要知道如何从已返回到SqlDataReader对象的数据库传输/传递一些记录行,并将该对象传递给View,这样我就可以使用foreach显示View中对象所包含的所有记录.
以下代码是我正在尝试做的事情.但它不起作用.
控制者:
public ActionResult Students()
{
String connectionString = "<THE CONNECTION STRING HERE>";
String sql = "SELECT * FROM students";
SqlCommand cmd = new SqlCommand(sql, connectionString);
using(SqlConnection connectionString = new SqlConnection(connectionString))
{
connectionString.Open();
SqlDataReader rdr = cmd.ExecuteReader();
}
ViewData.Add("students", rdr);
return View();
}
Run Code Online (Sandbox Code Playgroud)
风景:
<h1>Student</h1>
<table>
<!-- How do I display the records here? -->
</table>
Run Code Online (Sandbox Code Playgroud) 我对连接模型和实体框架中的断开连接很困惑.
我使用的是传统的ADO.net(DataReader用于连接模型和DataAdapter断开连接的模型),当我需要发送更多用户需要更新或插入以及在几种情况下断开模型时,我知道我使用连接模型数据到其他进程对内存中的数据进行一些操作并将它们发送回数据库.
现在我在EF中阅读了一些关于连接模型和断开连接模型的文章,我很困惑为什么要将实体明确地附加到断开连接模型中的上下文?我还读过web中的默认行为是断开连接的模型,而WPF中的默认行为是连接模型!
asp.net ado.net entity-framework sqldatareader sqldataadapter
我注意到从IDataReader使用声明中读取一些我无法理解的好奇心.虽然我确信答案很简单.
为什么在内部using (SqlDataReader rd) { ... }如果我直接执行一个yield return阅读器在阅读期间保持打开状态.但是,如果我执行直接return调用SqlDataReader扩展方法(如下所述),读者在枚举可以实现之前关闭?
public static IEnumerable<T> Enumerate<T>(this SqlDataReader rd)
{
while (rd.Read())
yield return rd.ConvertTo<T>(); //extension method wrapping FastMember
rd.NextResult();
}
Run Code Online (Sandbox Code Playgroud)
为了完全清楚我在问什么,我不确定为什么以下内容根本不同:
一个充实的例子,根据@ TimSchmelter的要求:
/*
* contrived methods
*/
public IEnumerable<T> ReadSomeProc<T>() {
using (var db = new SqlConnection("connection string"))
{
var cmd = new SqlCommand("dbo.someProc", db);
using(var rd = cmd.ExecuteReader())
{
while(rd.Read())
yield return rd.ConvertTo<T>(); //extension method wrapping FastMember
}
}
}
//vs
public IEnumerable<T> ReadSomeProcExt<T>() …Run Code Online (Sandbox Code Playgroud) sqldatareader ×10
c# ×9
.net ×3
ado.net ×3
datareader ×2
sql ×2
asp.net ×1
asp.net-mvc ×1
bit ×1
boolean ×1
database ×1
datetime ×1
ienumerable ×1
nullable ×1
sql-server ×1
sqlclient ×1
winforms ×1
yield-return ×1