2016-12-18 5 views
0

私はC#プログラムを持っています。私のコードは、次のようなSQL文を生成しました。アクセスSQL文を挿入するC#で動作しない

INSERT INTO [TWEET_RESULT] ([SearchKeyword], [TweetID], [RetweetCount], [URL], [Body], [PostedTime], [Sentiment]) 
VALUES ("BVN", "tag:search.twitter.com,2005:528481176659697664", "1", "http://twitter.com/austin_ebi/statuses/528481176659697664", "Pls what is BVN going to be used for? Why can't every Nigerian just have 1 National Insurance number to be used for all purposes?", "2014-11-01T09:38:25.000Z", "NEUTRAL") 

このSQL文をAccessデータベースで実行すると、レコードを正しく挿入することで機能します。

しかし、レコードを挿入するために私のC#コードで同じクエリを実行します。それは何もしません。

フィールド値を囲むために二重引用符を使用した理由は、一部のフィールド値に特殊文字が含まれる可能性があるためです。単一の引用符だけを使用してフィールド値を囲む場合、同じクエリが前に動作しました。

私はC#コードで例外メッセージをチェックします。それは言う:

ERROR [42000] [Microsoft] [ODBC Microsoft Access Driver] 'は有効な名前ではありません。無効な文字や句読点が含まれていないこと、および長すぎないことを確認してください。

+0

私は薄い問題は、クエリではいけません。単純なselectクエリを試して、それが機能するかどうかを確認してください。テーブルから1レコードと1を選択し、それが機能するかどうかを確認します。 – CodingYoshi

+0

申し訳ありませんが、私はあなたが1レコードを選択して何を意味するのか分かりません。私はMicrosoft Accessの内部でそれを実行すると、挿入SQL文が動作するようです。私のC#コードが同じSQLクエリを実行しようとすると、例外として実行されます。 – rvpals

+0

\、カンマなどの特殊文字を含むフィールド値を囲む方法特殊文字のために一重引用符は使用できません。二重引用符を使用すると、C#コードから爆発します。奇妙な。 – rvpals

答えて

2

は引用エンクロージャまたはエスケープの必要性を回避し、パラメータ化クエリを考えてみましょう:

OdbcConnection conn = new OdbcConnection(connString); 

String strSQL = "INSERT INTO [TWEET_RESULT] ([SearchKeyword], [TweetID], [RetweetCount], [URL], [Body], [PostedTime], [Sentiment]) " + 
       "VALUES (?, ?, ?, ?, ?, ?, ?);" 

OdbcCommand cmd = new OdbcCommand(strSQL, conn); 
cmd.Parameters.Add("Search", OdbcType.Varchar).Value = "BVN"; 
cmd.Parameters.Add("TweetID", OdbcType.Varchar).Value = "tag:search.twitter.com,2005:528481176659697664"; 
cmd.Parameters.Add("Retweet", OdbcType.Varchar).Value = "1"; 
cmd.Parameters.Add("URL", OdbcType.Varchar).Value = "http://twitter.com/austin_ebi/statuses/528481176659697664"; 
cmd.Parameters.Add("Body", OdbcType.Varchar).Value = "Pls what is BVN going to be used for? Why can't every Nigerian just have 1 National Insurance number to be used for all purposes?"; 
cmd.Parameters.Add("PostedTime", OdbcType.Varchar).Value = "2014-11-01T09:38:25.000Z"; 
cmd.Parameters.Add("Sentiment", OdbcType.Varchar).Value = "NEUTRAL"; 

try 
{ 
    conn.Open(); 

    Int affectedRows = cmd.ExecuteNonQuery();  
    Console.WriteLine("Affected Rows: {0}", affectedRows); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
}   
+0

ありがとう、私はパラメータ化されたクエリでこれを試してみます。 – rvpals

+0

私はクエリでは、代わりにこの例外があります:エラー[07002] [Microsoft] [ODBC Microsoft Access Driver]パラメータが少なすぎます。7.コードが実行する7つの値が入力されていることを確認しましたが、パラメータは少なすぎます。 – rvpals

+0

param値が渡されていないようです。私はC#のエキスパートではなく、チュートリアルサイトからこれを手に入れました。 OleDbConnectionまたはOdbcConnectionをMS Accessで使用していますか?名前付きパラメータは許可されない可能性があります。疑問符をプレースホルダとして使用してみてください(SQL文でのみ)。 '.AddWithValue'で' @ 'を削除してください。 – Parfait

関連する問題