1

我使用一个简单的表单来测试一些数据库紧凑代码,以将数据添加到数据库中。当我单击 AddBtn 时,我只想将一些文本字段中的值插入到我的数据库中,但我收到此错误“初始化字符串的格式不符合从索引 0 开始的规范”。问题似乎在 SqlCeConnection 行中。

完整的代码示例:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.Sql;
    using System.Data.SqlClient;
    using System.Data.SqlServerCe;

    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
        InitializeComponent();
            }

            private void AddBtn_Click(object sender, EventArgs e)
            {
                SqlCeConnection con = new SqlCeConnection(@"C:\Users\Name\Documents\Visual Studio         2012\Projects\DataBaseTest\MyDatabase#1.sdf");
                try {
                    con.Open();

                    SqlCeCommand cmd = con.CreateCommand();

                    cmd.CommandText = "insert into test ([ID], [OrderID], [KundID]) values('"+textBox1.Text+"','"+textBox2.Text+"','"+textBox3.Text+"')";

                    try {
                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception ex) {
                        MessageBox.Show(ex.Message);
                    }


                }
                catch (Exception ex) {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }
4

2 回答 2

5

是的,您的连接字符串是错误的。
看这里http://www.connectionstrings.com/sql-server-2005-ce

更正的应该是

 string pathSDF = @"C:\Users\Name\Documents\Visual Studio 2012" + 
                   "\Projects\DataBaseTest\MyDatabase#1.sdf";
 SqlCeConnection con = new SqlCeConnection("Data Source=" + pathSDF + 
                                           ";Persist Security Info=False;");

除此之外,您的 SQL 命令非常危险。您永远不应该编写连接直接取自用户输入的字符串的 sql 命令。这会导致Sql Injection Attacks
将您的代码更改为:(我假设您的 ID 字段是数字类型而不是 varchars)

  cmd.CommandText = "insert into test ([ID], [OrderID], [KundID]) values " + 
                    "(@userID, @orderID, @kundID)";  

  cmd.Parameters.AddWithValue("@userID", Convert.ToInt32(textBox1.Text));
  cmd.Parameters.AddWithValue("@orderID", Convert.ToInt32(textBox2.Text));
  cmd.Parameters.AddWithValue("@kundID", Convert.ToInt32(textBox3.Text));
于 2012-10-15T11:17:22.350 回答
3

您没有使用有效的连接字符串('Data Source='在 SDF 的路径之前添加。请参阅 MSDN 文档以获取SqlCeConnection.

SqlCeConnection con = new SqlCeConnection(@"Data Source=C:\Users\Name\Documents\Visual Studio         2012\Projects\DataBaseTest\MyDatabase#1.sdf"

除此之外,不要直接在查询中使用按钮的文本(让你容易受到 SQL 注入攻击),而是使用 SQL 参数(同样 MSDN 是你的朋友。)

于 2012-10-15T11:20:52.683 回答