无法在新计算机上回写Access DB(Windows 8)

时间:2013-06-18 08:09:57

标签: sql ms-access windows-8

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

1 个答案:

答案 0 :(得分: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();
}