【问题标题】:Retrieving info from a database in C# with SQL commands使用 SQL 命令从 C# 中的数据库中检索信息
【发布时间】:2018-09-09 12:41:22
【问题描述】:

我目前正在尝试用 C# 制作图书管理员。我正在使用.ACCDB 数据库来存储有关书籍的数据。

首先我检索属于特定系列的bookIDs

sql.CommandText = "select * from BookTable where SeriesID = " +
DataClass.SeriesTableIndex;

它检索BookIDs 2023。这些是正确的BookIDs,对应于数据库中的SeriesID

在此之后,我的代码将构建下一个 sql 命令。 我省略了命令的功能构建。 它构建了以下代码:

string sqlcommand = "select * from BookTable where BookID = 23 or 20"

我使用这个命令来获取书名:

sql.CommandText = sqlcommand;

它应该只返回bookWithID23bookWithID20,但它也返回bookWithID21。我的测试数据库中只有 3 本书,但它以某种方式返回了所有 3 本书,而不是系列中的 2 本书。

我对SQL一无所知,所以这可能是一个简单的语法错误。

【问题讨论】:

  • BookID = 23 或 20 始终为真,因为 'or 20' 是一个始终评估为真的常数,因此这就是您在表中获取所有记录的原因。你应该按照@S.Akbari 的建议写。这种行为不是 SQL 独有的
  • 执行 2 个查询是没有意义的。第一个已经返回了你需要的书籍的所有栏目。

标签: c# sql .net ms-access


【解决方案1】:

or 的正确语法是 (https://www.w3schools.com/sql/sql_and_or.asp):

"BookID = 23 or BookID = 20"

此外,您应该始终使用parameterized queries 来避免SQL Injection,如下所示:

sql.CommandText = "select * from BookTable where SeriesID = @SeriesID";
sql.Parameters.AddWithValue("@SeriesID", DataClass.SeriesTableIndex);

虽然直接指定类型,使用Value属性比AddWithValue好:

sql.Parameters.Add("@SeriesID", SqlDbType.Int).Value = DataClass.SeriesTableIndex;

Can we stop using AddWithValue() already?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多