【问题标题】:SQL CE Not entering information to DBSQL CE 未向数据库输入信息
【发布时间】:2013-10-08 17:22:24
【问题描述】:

当我运行我的应用程序时,它会一直运行到最后,但是当我之后检查我的数据库时,它永远不会显示任何数据。这是我的代码:

private void button1_Click(object sender, EventArgs e)
    {
        string saltedcryps = saltpassword(10);
        string passWithSalt = (textBox1.Text + saltedcryps);
        string hashedResult = hashPassAndSalt(passWithSalt);
        if (checkPasswordsMatch() == "B")
        {
            SqlCeConnection myConnection = new SqlCeConnection("Data Source = pwdb.sdf");
                    try
                    {
                        myConnection.Open();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                    SqlCeCommand myCommand = new SqlCeCommand("INSERT INTO PW Values ('Master', '" + saltedcryps + "', '" + hashedResult + "');", myConnection);
                    myCommand.ExecuteNonQuery();
                    myConnection.Close();
                    this.Hide();

        }
    }
    private string checkPasswordsMatch()
    {
        if (textBox1.Text == "")
        {
            MessageBox.Show("Passwords cannot be empty");
            return "A";
        }
        else
        {
            MessageBox.Show(textBox1.Text == textBox2.Text ? "Thanks for registering!" : "Your passwords do not match");
            return "B";
        }
    }
    private string saltpassword(int size)
    {
        RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
        byte[] buff = new byte[size];
        crypto.GetBytes(buff);
        return Convert.ToBase64String(buff);
    }
    private string hashPassAndSalt(string passWithSalt)
    {
        HashAlgorithm hashAlg = new SHA256CryptoServiceProvider();
        byte[] bytValue = System.Text.Encoding.UTF8.GetBytes(passWithSalt);
        byte[] bytHash = hashAlg.ComputeHash(bytValue);
        string base64 = Convert.ToBase64String(bytHash);
        return base64;
    }
}

问题出在button1_Click上。当它运行myCommand.ExecuteNonQuery();它从不抛出异常,它只是继续,没有实际输入任何信息......

有人知道吗?

【问题讨论】:

  • 为什么只在try 块中打开连接?如果将 SqlCeCommand myCommand = new SqlCeCommand("INSERT INTO PW Values ('Master', '" + saltedcryps + "', '" + hashedResult + "');", myConnection); myCommand.ExecuteNonQuery(); myConnection.Close(); this.Hide(); 移到 try 块中会发生什么?
  • 还是不行。 try 块尝试打开连接,如果成功则通过 catch 块然后运行下一个代码。无论哪种方式,它基本上都是一样的
  • 在您的bindebug文件夹中查找数据库文件的副本,最好的方法是在连接字符串中使用完整路径
  • 是的,但是当我部署它时,它不会工作,因为安装文件夹会有所不同?
  • 查看我最新的博文以获取一些建议

标签: c# sql winforms sql-server-ce


【解决方案1】:

试试这个:

    if (checkPasswordsMatch() == "B")
        {
            SqlCeConnection myConnection = new SqlCeConnection("Data Source = pwdb.sdf");
                    try
                    {
                        myConnection.Open();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                    SqlCeCommand myCommand = myConnection.CreateCommand();
                    myCommand.CommandType = CommandType.Text;
myCommand.CommandText = "INSERT INTO PW Values ('Master', '" + saltedcryps + "', '" + hashedResult + "');"
                    myCommand.ExecuteNonQuery();
                    myConnection.Close();
                    this.Hide();

        }

如果这不起作用,请尝试将绝对路径放在连接字符串上。

【讨论】:

  • new myConnection.CreateCommand() 创建红线,找不到类型或命名空间 myConnection。和 '" + hashedResult + "');创建“常量换行符”
  • 这行得通,但是当我部署应用程序时呢?数据库不会在客户端计算机上的同一文件夹中?
  • 你试过了吗?:SqlCeConnection myConnection = new SqlCeConnection("Data Source = /pwdb.sdf");
  • 这个答案包含一些不好的建议;捕获异常然后继续使用引发异常的对象是非常糟糕的。在数据库命令中显示 MessageBox 也很糟糕;如果它是从后台线程调用的呢? Data Source = pwdb.sdf 仅在数据库嵌入您的应用程序时才能工作,即使这样,您也只能在以管理员身份运行时插入其中。这是一个安全风险。
【解决方案2】:

那个连接字符串看起来不对;除非您正在做一些非常奇怪的事情,否则您应该使用Data Source=|DataDirectory|pwDB.sdf

为什么您认为您的数据库“从不显示任何数据”?你在哪里寻找数据?在您的项目目录中的原始源数据中?这几乎肯定是错误的。当您部署您的应用程序时,您并没有部署您的源代码是吗?您需要查看部署文件夹,咨询this answer

【讨论】:

  • 数据库已链接到项目。我在项目中做到了?
  • 没关系,@tony,但是当您部署应用程序时,您并没有部署项目,是吗?请提供更多详细信息,因为我不明白您在做什么。
  • 我正在制作一个安全存储密码的应用程序。我提供的此代码将密码注册到数据库。那么,当我将软件发送给客户端时,如何将数据库与应用程序一起发送,因为他们机器中的安装文件夹与我计算机上的文件夹不同,那么我该如何引用呢??
  • @tony,你如何“将软件发送给客户”以及他们如何安装它?
【解决方案3】:

将 try catch 放在 ExecuteNonQuery 周围,这样您就可以查看是否存在异常,否则必须与您的连接字符串有关(DataSource=pwDB.sdf 对我来说不正确)必须具有用户 ID;密码; dataSource=您的 IP 和初始目录:

        SqlCommand Command = new SqlCommand(YourQuery,myConnection);

        myConnection.Open();
        int Rows=0;
        try
        {
            Rows = Command.ExecuteNonQuery();
            myConnection.Close();

        }
        catch (Exception ex)
        {
            conSMS.Close();
            string Msg = ex.Message;
                            //I log my exceptions
            //Log("ERROR: "+RemoveSQ(Query));
            //Log(RemoveSQ(Msg));
        }

        //check Rows here if there is no exception

【讨论】:

  • 它不在服务器上或类似的东西上,它是在项目中创建的
  • 那么数据库在哪里?如果它只在用户计算机上离线运行,那么您必须有一个脚本在他们的计算机上创建它,以便他们访问它跨度>
  • 我以为你在应用程序中创建了数据库,然后它会使用应用程序复制该数据库并使用那个数据库?
  • DataSource=DataDirectory\\pwdb.sdf,DataDirectory 取决于您如何安装应用程序,我知道 Web 应用程序使用 App_Data 文件夹,不确定您的文件夹是什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多