我想使用select语句来查找是否存在已存在的记录.我把代码放在下面,但它在dReader = comm.ExecuteReader()时抛出一个错误; 而且我不确定为什么.有帮助吗?
string connString = "Data Source=KIMMY-MSI\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True";
SqlDataReader dReader;
SqlConnection conn = new SqlConnection(connString);
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "SELECT * FROM Customers WHERE CustomerID == " + txtID.Text;
comm.Connection.Open();
dReader = comm.ExecuteReader();
if (dReader.HasRows == true)
{
Response.Write("Exists");
}
Run Code Online (Sandbox Code Playgroud)
错误:
Invalid Column Name (whatever I input)
Run Code Online (Sandbox Code Playgroud)
它似乎正在寻找一个名为我输入的列,而不是寻找实际数据.
我对以下问题感到困惑;
我正在尝试使用SqlDataReader检索记录(列'EmployeeId'(int)).
当我直接在服务器上运行查询时,我正确地获得了记录.当我运行相同的过程来获取另一列(字符串)时,我正确地获得了记录.
我认为问题是由于我试图获得一个int,程序跳过了
while (mySqlDbDataReader.Read())
Run Code Online (Sandbox Code Playgroud)
并直接去
catch (Exception eMsg1)
{
Run Code Online (Sandbox Code Playgroud)
这是完整的程序
public string getUserId()
{
//Check user details against login in Db
//Local variables to capture values from Db
string varId = "";
//Connection string
conn = sqlDbConnection.GetConnection();
SqlCommand newCmd = conn.CreateCommand();
newCmd.Connection = conn;
newCmd.CommandType = CommandType.Text;
//Query
userCredentials connectedUser = new userCredentials();
newCmd.CommandText = "SELECT EmployeeId FROM tblEmployees WHERE WinLogin='" + connectedUser.getWindowsLogin() + "';";
//Connect
newCmd.Connection = conn;
conn.Open();
//Utilisation du try-catch permettant de fermer …Run Code Online (Sandbox Code Playgroud) 我有一个返回数据读取器的方法.通常情况下,我会在数据读取器周围进行一次使用,以便在迭代它之后很好地处理它.问题是我选择使用Linq来使用数据读取器,这意味着延迟执行会导致读者提前处理.使用Linq是否有合适的模式来使用和处理数据阅读器而无需构建完整的内容集合?
using (System.Data.SqlClient.SqlDataReader reader = CallStoredProcedure())
{
return reader.Cast<System.Data.Common.DbDataRecord>().Select(rec => new ObjectModel.CollectorSummaryItem()
{
CollectorID = (int)rec[0],
Name = rec.IsDBNull(1) ? null : rec.GetString(1),
Information = rec.IsDBNull(2) ? null : rec.GetString(2)
});
}
Run Code Online (Sandbox Code Playgroud) 我很难过,我试图从数据库中填充5个文本框,而不是所有5个文本框都会有数据.
例:
ID | ItemID | QTYPE
1 | 10 | 2盒
2 | 10 | 6盒
3 | 11 | 1个案例
在这个例子中,它将填充QuantityType1TxtBox 2 Boxes和QuantityType2TxtBox 6 Boxes,而其他三个文本框留空.
我尝试运行此代码时得到的以下错误是:索引超出了数组的范围.
此行发生此错误:QuantityType2TxtBox.Text = rdr.GetString(1);
SqlCommand cmd = new SqlCommand(@"SELECT QType FROM InventoryQType
WHERE ItemID = '" + itemID + "'", conn);
conn.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
QuantityType1TxtBox.Text = rdr.GetString(0);
QuantityType2TxtBox.Text = rdr.GetString(1);
QuantityType3TxtBox.Text = rdr.GetString(2);
QuantityType4TxtBox.Text = rdr.GetString(3);
QuantityType5TxtBox.Text = rdr.GetString(4);
}
rdr.Close();
Run Code Online (Sandbox Code Playgroud) 我想要做的是类似于OP在这里问的:
我试图将一个或多个SQL查询的结果存储到单独的DataTables中.上述问题方法的问题在于它仅适用于每个结果集中的离散值.最好使用DataTables Load(reader)方法将每个结果集存储在单个语句中,而不是迭代所有DataReader的列.
在下面的代码中,我有两个SQL查询(尽管这应该适用于任意数量的查询),其结果我尝试存储在临时数据表中,然后存储到数据表列表中.我的代码的问题是它只返回第一个查询的结果集,并添加后续查询会抛出一个Reader is closed exception.
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand
("SELECT TOP 10 Column1, Column2 FROM Table1; SELECT TOP 10 Column1, Column2 FROM Table2", connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
tempTable.Reset();
tempTable.Load(reader);
dataTables.Add(tempTable);
}
if (reader.NextResult())
{
while (reader.Read())
{
tempTable.Reset();
tempTable.Load(reader);
dataTables.Add(tempTable);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经挣扎了几个小时.我不确定DataTable/DataReader是否只是为我的用例设计得很差,或者我是否遗漏了一些基本的东西.
具有返回多个结果的查询时,我们迭代其中使用NextResult()的SqlDataReader。这样我们就可以按顺序访问结果。
有没有办法以随机/非顺序方式访问结果。例如首先跳转到第三个结果,然后跳转到第一个等等
我正在搜索是否有类似的东西rdr.GetResult(1)或解决方法。
既然有人问我为什么要这样的东西,
更新 13/6
虽然Jeroen Mostert 的回答对原因给出了深思熟虑的解释,但Think2ceCode1ce 的回答显示了解决方法的正确方向。评论中链接的内容如何附加dataset可以用于以某种async方式工作。恕我直言,如果要编写通用解决方案,这将是要走的路。但是,就我而言,我的解决方案基于数据的性质及其背后的逻辑。简而言之,(1)我使用顺序读取数据SqlDataReader; (2) 当我读取行中的第一个但逻辑 ResultSet 中的第二个时,我将一些我需要的数据存储在字典和集合中;(3) 当我正在阅读第三行,但首先是在逻辑 ResultSet 中,我正在遍历我之前构建的集合,并基于字典数据构建我的最终结果。
最终代码似乎比使用async DataAdapter. 但是,这是基于我的数据的非常具体的解决方案。
在我正在研究的程序中,需要三个步骤将数据放入已创建的字典中:
DataTable,然后DataTable入Dictionary码:
var myDr = myLookup.ExecuteReader();
dt.Load(myDr);
customerLookup = dt.AsEnumerable()
.ToDictionary(key => key.Field<string>("code"),
value => value.Field<string>("customerText"));
Run Code Online (Sandbox Code Playgroud)
我的问题是,可以说可以“削减中间人”并将数据SqlDataReater直接从“字典”中提取出来吗?还是有必要DataTable先将其拉上?如果我想做的事情可行,有人可以将代码发布给我尝试吗?
非常感谢!
首先:它不是一个不起作用的特定陈述.SELECT * FROM [TABLE];也不起作用.当我在SSMS中以用户A运行它时,它的工作非常好.当我在C#中使用它时,如下所示:
string sqlCommand = "SELECT * FROM [TABLE];"
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Name"].ToString()))
using (var command = new SqlCommand(sqlCommand, conn))
{
conn.Open();
using (var dataReader = command.ExecuteReader())
{
while (dataReader.Read())
{
// work with results
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用try-catch记录此代码块,并收到以下错误消息: System.Data.SqlClient.SqlException (0x80131904): The SELECT permission was denied on the object 'TABLE', database 'MyDb', schema 'dbo'.
即使我在db所在的服务器上运行程序,我也会遇到同样的错误.
我的连接字符串看起来像这样:
Data Source=Server\Something;Initial Catalog=MyDb;User ID=DOMAIN\username;Password=verySecurePassword;Trusted_Connection=True;
Run Code Online (Sandbox Code Playgroud)
用户A在整个数据库上具有datareader角色.
你知道为什么会这样吗?我的数据库管理员也无法帮助我,它似乎不是一个网络问题,因为连接似乎工作.
我正在使用asp.net(webforms)和C#设计一个网站.我有一个有23列的表.
在下面的代码中,reader是一个SqlDataReader和命令是一个SqlCommand对象.我正在使用以下代码从中输出查询结果:
command.CommandText = "SELECT * FROM devices WHERE device_level='" + ACCESS_LVL + "'" + "ORDER BY device_name";
reader = command.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
然后我使用循环它
while(reader.Read());
Run Code Online (Sandbox Code Playgroud)
输出结果.
但是,访问某些列会导致索引超出范围异常(索引大于17).我的表有23列,但reader.FieldCount只返回18.
调试代码时,本地计算机上不会发生此问题.它只发生在我将项目上传到我的Web服务器时.
使用mylittleadmin数据库管理面板(安装在远程服务器上)我可以看到所有23列.
这个问题是这个DBA相关问题之后的下一步。
我现在有以下 C# 代码,基于变量SqlCommand sqlCommand和SqlDataReader sqlDataReader.
我正在运行这段代码:
// What's the max difference of two "Own_Table" tupples for "Field_Name" column?
sqlCommand.CommandText = $"SELECT MAX(val - lag_value) FROM " +
$" (SELECT t.{Field_Name} AS val,LAG(t.{Field_Name}) " +
$" OVER(ORDER BY t.{Field_Name}) as lag_value " +
$" FROM {Own_Table} t) AS tmp " +
$"WHERE lag_value IS NOT NULL";
sqlCommand.Parameters.Clear();
sqlDataReader = sqlCommand.ExecuteReader();
long max_value = 0;
while (sqlDataReader.Read())
{
max_value = sqlDataReader.GetInt32(0); <== sometimes NOK …Run Code Online (Sandbox Code Playgroud) c# ×10
sqldatareader ×10
sql-server ×4
asp.net ×1
dictionary ×1
int ×1
integer ×1
linq ×1
sql ×1
ssms ×1