数据库查询忽略表中的第一行

时间:2014-03-10 13:02:54

标签: c# visual-studio-2010



从表中获取第一行的结果我遇到了问题。它只是忽略它而导致第二行。

查询需要从 textBox1 中给出的值得到 column_b 的最高或相等值。

即如果我在 textBox1 中输入 12 ,结果应为: column_a = 1,5 | column_b = 18,5 但它会忽略第一行并给出 column_a = 2,5 |的结果 column_b = 25

正在使用的表格示例:

+----------+----------+
| column_a | column_b |
+----------+----------+
|   1,5    |   18,5   |
|   2,5    |    25    |
|    4     |    34    |
|    6     |    47    |
+----------+----------+

代码:

//Table used from database    
string tableused = "main_table";

//Connecting to Database
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data\\db\\database.mdb");
connection.Open();

//Database Query    
OleDbCommand select = new OleDbCommand();
select.Connection = connection;
select.CommandText = "SELECT TOP 1 column_a,column_b FROM " + tableused + " WHERE column_b+0 >=" + textBox1.Text + "+0 ORDER BY column_b+0 ASC";

//Reading the query output   
OleDbDataReader reader = select.ExecuteReader();
        while (reader.Read())
        {
         label5.Text = (reader[0].ToString());
         label6.Text = (reader[1].ToString());
        }
        reader.Close();
        connection.Close();

任何人都有解决此问题的方法吗?

2 个答案:

答案 0 :(得分:1)

您说您使用Text作为数值的数据类型。

您的+0代码现在发生的事情是您正在查询18.50250等的值。250大于或等于您的输入{{1}例如+0120较小,因此不会在结果集中返回。

Microsoft Access进行了很多隐式转换,是的,但你不能像你一样信任它。

如果需要数值,请使用数值数据类型。

答案 1 :(得分:0)

正如亚历山大指出的那样,你的+"0"目的是强制进行转换是个问题。

在文本字段中存储数字和日期是一个常见错误,只是因为您希望它们以特定格式显示。始终以格式中性格式存储数据,即数字字段中的数字和日期或日期/时间字段中的日期。

在显示字段时应用所需的格式,即将值转换为string

如果要构建带有字符串连接的SQL命令,则必须将值转换为对所使用的SQL方言和数据库文化有效的文字。找到正确的日期文字并不容易,但由于不同文化中使用的千位和小数分隔符不同,数字也存在问题。因此(并且为了对抗SQL injection)总是使用命令参数。这对于表名是不可能的,但我认为这些不是由用户直接输入的,因此它们是安全的(否则检查表名是否有效!)。

double d;
if (Double.TryParse(textBox1.Text, out d)) {
    select.CommandText = "SELECT TOP 1 column_a, column_b FROM " + tableused + 
        " WHERE column_b >= @1 ORDER BY column_b ASC";
    select.AddWithValue("@1", d);
    ...
} else {
    // Number not valid
}