C# 没有为连接初始化中的一个或多个必需参数提供值

C# 没有为连接初始化中的一个或多个必需参数提供值,c#,connection,C#,Connection,我有一个使用access数据库的C#表单应用程序 该应用程序在调试和发布时都能完美工作。它适用于所有版本的Windows。 但是它在一台装有Windows7的电脑上崩溃了 我得到的信息是: System.Data.OleDb.OleDbException:没有为一个或多个必需参数提供值。 编辑,在有问题的计算机上使用messagebox进行一些调试后,下面是出现错误的代码。错误被捕获在cmd.ExecuteReader()上。此时将显示前面的messagebox,下一个messagebox是ca

我有一个使用access数据库的C#表单应用程序

该应用程序在调试和发布时都能完美工作。它适用于所有版本的Windows。 但是它在一台装有Windows7的电脑上崩溃了

我得到的信息是:

System.Data.OleDb.OleDbException:没有为一个或多个必需参数提供值。

编辑,在有问题的计算机上使用messagebox进行一些调试后,下面是出现错误的代码。错误被捕获在cmd.ExecuteReader()上。此时将显示前面的messagebox,下一个messagebox是catch中的messagebox,下面有一个例外。有什么想法吗

public List<CoeffItem> GetModeleCoeff()
    {

        List<CoeffItem> list = new List<CoeffItem>();
        try
        {
            OleDbDataReader dr;
            OleDbCommand cmd = new OleDbCommand("SELECT nIDModelAquacad, nIDModeleBorne, fCoefficient FROM tbl_ModelBorne ORDER BY nIDModelAquacad", m_conn);
            MessageBox.Show("Commande SQL créée avec succès");

            dr = cmd.ExecuteReader();

            MessageBox.Show("Exécution du reader sans problème!");

            while (dr.Read())
            {
                list.Add(new CoeffItem(Convert.ToInt32(dr["nIDModelAquacad"].ToString()),
                    Convert.ToInt32(dr["nIDModeleBorne"].ToString()),
                    Convert.ToDouble(dr["fCoefficient"].ToString())));
            }
            MessageBox.Show("Lecture du reader");

            dr.Close();
            MessageBox.Show("Fermeture du reader");
        }
        catch (OleDbException err)
        {
            MessageBox.Show("Erreur dans la lecture des modèles/coefficient: " + err.ToString());
        }
        return list;
    }

您没有转义文件路径

您应该使用,它将正确地转义带有特殊字符的路径,并且可能会解决您的问题

例如:

OleDbConnectionStringBuilder builder = new OleDbConnectionStringBuilder();
builder.Provider = "Microsoft.Jet.OLEDB.4.0";
builder.DataSource = strFile;
builder["User Id"] = "admin";

将此检查添加到方法的开头可能是值得的,只是为了更容易判断何时未正确调用此方法。不确定这是否是您遇到的问题,但它可能排除了一个可能的错误

        if (string.IsNullOrEmpty(strFile))
        {
            throw new ArgumentNullException("strFile", "strFile must be set");
        }

可能您缺少初始目录,即您想要连接到的数据库


Initial Catalog=YourDBName

好的,下面是发生的情况

数据库在一个表中缺少2列。原因是什么?在应用程序中,当用户单击“新建”时,会将应用程序文件夹中的.mdb复制到用户选择的位置。“model”数据库正常,所有列都在那里,但复制的文件缺少2列。所以我做了一些研究,发现应用程序使用的是Windows7的虚拟存储,而不是程序文件目录。为什么?我们认为用户使用旧版本的应用程序(和数据库)将文件保存在程序文件目录中(导致虚拟存储中出现副本)。此时,虚拟存储优先于程序文件使用,一切都不正常


所以谢谢你的帮助,它帮我找到了问题

这有可能是Windows 7 x64位吗?strFile的值是如何传递到InitConnection的(或者在一台计算机的情况下-没有传递到函数中)?Darin:没有,是x86 ktharsis:我不知道该值,因为它不在调试中,它是已安装的版本。如果上面和下面的事情不起作用,我会放一个消息框或日志文件,这样我就可以看到问题。谢谢,请删除您的邪恶
catch
块,然后重新发布堆栈跟踪。我只是编辑了堆栈跟踪,没有catch块。有什么想法吗?我在connectionstrings.com上查过,因为文件中只有一个数据库,所以不需要access数据库的初始目录。无论如何,谢谢你:)
        if (string.IsNullOrEmpty(strFile))
        {
            throw new ArgumentNullException("strFile", "strFile must be set");
        }