从表中获取第一行的结果我遇到了问题。它只是忽略它而导致第二行。
查询需要从 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();
任何人都有解决此问题的方法吗?
答案 0 :(得分:1)
您说您使用Text作为数值的数据类型。
您的+0
代码现在发生的事情是您正在查询18.50
,250
等的值。250
大于或等于您的输入{{1}例如+0
。 120
较小,因此不会在结果集中返回。
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
}