0

短い:

C#コードのSQLステートメントが機能していません。with(nolock)コードを壊しています。

詳細:

以下は私のエラーとエラーが発生するコードです。コードはSQLServerデータベースに接続し(接続コードは正常に機能します)、クエリを実行することになっています。このクエリは、URIが「blah」であるすべてのイベントのIPアドレスを取得します。問題は、with(nolock)私が使用する必要がある私のコマンドのようです。すべてのT-SQLクエリのグループ標準であるため、これを使用する必要があります。

私はしばらくグーグルで検索しましたが、私の問題に合うものは何もないようで、見つけた修正はまだ機能していません。私のコードやリンクについての助けをいただければ幸いです。

エラー:

System.Data.SqlClient.SqlExceptionがキャッチされましたMessage=キーワード'with'の近くの構文が正しくありません。このステートメントが共通テーブル式、xmlnamespaces節、または変更追跡コンテキスト節である場合、前のステートメントはセミコロンで終了する必要があります。
Source =.NetSqlClientデータプロバイダーErrorCode=-2146232060 Class = 15 LineNumber = 1 Number = 319 Procedure = "" Server = State = 1

コード:

try
{
   //create sql reader to display data
   SqlDataReader myReader = null;

   //create string to enter data into database
   string insString = @"select c_ip from @dates with(nolock) where cs_uri like 'blah'";
   SqlCommand myCommand = new SqlCommand(insString, DbConnection);

   //populate and sanitize parameters
   myCommand.Parameters.Add("@dates", SqlDbType.VarChar, 100);
   myCommand.Parameters["@dates"].Value = currentdate;

   //execute the command
   myReader = myCommand.ExecuteReader();

   //read all results and print them to output
   while (myReader.Read())
   {
      //get IPs              
      String ipmix = myReader["c_ip"].ToString();
      mainIPs.Add(ipmix);
   }
}
catch (Exception e)
{
   Console.WriteLine("The query connection to the datebase has timed out.\n");
   Console.WriteLine(e.ToString());
   Console.ReadLine();
}

解決:

コードを次の場所から変更します。

//create string to enter data into database
string insString = @"select c_ip from @dates with(nolock) where cs_uri like 'blah'";

に:

//create string to enter data into database
string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri like '%blah'";
4

3 に答える 3

8

WITHではなく、@dates変数です。基本的にステートメントを作成しています...

select c_ip from '12/28/2011 15:35:22.997' with(nolock) where cs_uri like 'blah'

これは意味がありません。

また、ユーザーへの例外メッセージは実際には正しくありません。エラーはさまざまなもの(「構文が正しくない」など)である可能性がありますが、タイムアウトの問題であると伝えています。

コメントに基づいて、クエリテキストを次のように変更する必要があります...

string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri = 'blah'";

ユーザー入力からではなくコードでcurrentdate値を生成しているため、SQLインジェクションのリスクはありません。同様のものを取り出してequalsに置き換えると、クエリのパフォーマンスも向上します。また、パラメータを完全に削除します。

于 2011-12-28T21:50:32.660 に答える
1

selectステートメントを作成するときに、パラメーターコードを削除し、テーブル名を追加します

string insString = @"select c_ip from " + currentdate + " with(nolock) where cs_uri like 'blah'";
于 2011-12-28T21:57:59.290 に答える
1

と呼ばれるテーブルからレコードを選択するように要求しました@Dates。(これは日付パラメータです)-次のように評価されます

select 'c_ip from 28-12-2011...'

あなたはおそらく次のようなものが欲しいでしょう

" logtable with(nolock)からc_ipを選択します。ここでcs_uriは'blah'やlog_date=@datesのようになります"

フィールドを使用している場合、日付は日付と時刻のコンポーネントで構成されていることを忘れないでください。したがって、からまでDATETIMEの関連する日付範囲を作成することもできます(または深夜の重複をキャッチするために使用します)。00:00:0023:59:59currentdate+1

それはあなたに

select c_ip from logtable with(nolock) where (cs_uri like '%blah%') and (log_date between @startdate and @enddate)
于 2011-12-28T21:58:38.747 に答える