-2

.sdfデータベースのテーブルにどのように挿入しますか?

私は次のことを試しました:

string connection = @"Data Source=|DataDirectory|\InvoiceDatabase.sdf";
SqlCeConnection cn = new SqlCeConnection(connection);

try
{
   cn.Open();
}
catch (SqlCeException ex)
{
    MessageBox.Show("Connection failed");
    MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
    Application.ExitThread();
}

string clientName = txt_ClientName.Text;
string address = txt_ClientAddress.Text;
string postcode = txt_postcode.Text;
string telNo = txt_TelNo.Text;

string sqlquery = ("INSERT INTO Client (Name,Address,Postcode,Telephone_Number)Values(" + clientName + "','" + address + "','" + postcode + "','" + telNo + ")");
SqlCeCommand cmd = new SqlCeCommand(sqlquery, cn);

try {
  int affectedRows = cmd.ExecuteNonQuery();

  if (affectedRows > 0)
  {
     txt_ClientAddress.Text = "";
     txt_ClientName.Text = "";
     txt_postcode.Text = "";
     txt_TelNo.Text = "";
     MessageBox.Show("Client: " + clientName + " added to database. WOoo");
  }
}
catch(Exception){
    MessageBox.Show("Insert Failed.");
} 

しかし、「挿入に失敗しました」と表示されるだけで何をしても問題ないようです。

前もって感謝します。

4

4 に答える 4

2

最初の値の開始引用符を忘れました。

Values(" + clientName + "','"

への変更:

Values('" + clientName + "','"

しかし、これは通常、クエリを作成する方法としては不適切です。代わりにパラメータ化されたクエリを使用してください。
参照: http://msdn.microsoft.com/en-us/library/system.data.sqlserverce.sqlcecommand.parameters(v=vs.80).aspx

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

エラーに関する詳細情報を提供します。

于 2013-03-27T13:33:49.703 に答える
2

同じ昔話です。文字列を連結するSQLコマンドを作成すると、これらの種類のエラーがたくさんあります。そして、単純な構文の問題は最悪ではありません。Sql インジェクションは最も危険なものです。

この方法でクエリを作成してください

string sqlquery = ("INSERT INTO Client (Name,Address,Postcode,Telephone_Number)" + 
                   "Values(@client,@address, @postcode, @tel)";
SqlCeCommand cmd = new SqlCeCommand(sqlquery, cn);
cmd.Parameters.AddWithValue("@client", clientName);
cmd.Parameters.AddWithValue("@address", address);
cmd.Parameters.AddWithValue("@postcode", postcode);
cmd.Parameters.AddWithValue("@tel", telNo);
cmd.ExecuteNonQuery();

他の人がすでに言っているように、構文エラーは最初の一重引用符を省略したことが原因です。しかし、他のエラーが発生する可能性があります。たとえば、? というクライアントはO'Haraどうでしょうか。これで、clientname 内に一重引用符があり、これが文字列連結を台無しにします。代わりに、パラメーターが正確に解析され、検出されたすべての問題のある文字が適切に処理されます (この場合、一重引用符を 2 倍にします)。

于 2013-03-27T13:42:13.007 に答える
1

SQL ステートメントが正しくありません。

string sqlquery = ("INSERT INTO Client (Name,Address,Postcode,Telephone_Number)Values('" + clientName + "','" + address + "','" + postcode + "','" + telNo + "')");

これを取る。値の先頭と末尾の ' を忘れました

于 2013-03-27T13:35:53.370 に答える