0

我有一个使用 VB.NET,VS 2012 编写的“.mdb”Access DB 的应用程序。在 Windows 8 中,我可以运行它,建立与 DB 的连接,使用“SELECT”语句从 DB 读取数据,但是当我尝试用“INSERT”或“UPDATE”语句写回数据,它给了我“语法错误”。具有完全相同代码的相同应用程序在 Windows 7 中运行良好。Win7 和 Win8 中的 SQL 语法有什么区别?

4

1 回答 1

0

这里的问题不是 Windows 的版本,而是 Windows 的“区域设置”控制面板中定义的小数分隔符。

某些语言环境使用逗号 ( ,) 作为小数分隔符,但 ACE/Jet 始终使用句点 ( .) 作为小数分隔符。因此,在为使用逗号的语言环境之一配置的机器上(例如“法语(加拿大)”),以下代码将失败:

using (OleDbCommand cmd = new OleDbCommand())
{
    cmd.Connection = con;
    cmd.CommandType = System.Data.CommandType.Text;
    string pi = Math.PI.ToString();  // "3,14159265358979"
    cmd.CommandText = 
            "INSERT INTO Constants (ConstantName, ConstantValue) " +
            "VALUES ('pi', " + pi + ")";
    cmd.ExecuteNonQuery();
}

这也是为什么使用参数化查询是个好主意的另一个原因,因为无论区域设置如何,以下代码都可以工作:

using (OleDbCommand cmd = new OleDbCommand())
{
    cmd.Connection = con;
    cmd.CommandType = System.Data.CommandType.Text;
    cmd.CommandText = 
            "INSERT INTO Constants (ConstantName, ConstantValue) " +
            "VALUES (?, ?)";
    cmd.Parameters.AddWithValue("?", "pi");
    cmd.Parameters.AddWithValue("?", Math.PI);
    cmd.ExecuteNonQuery();
}
于 2013-06-18T11:59:59.847 回答