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 インジェクション攻撃
につながり ます コードを次のように変更します: (ID フィールドは varchar ではなく数値型であると仮定します)

  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 に答える