1

Windows アプリケーションからストアド プロシージャにパラメーターを渡そうとしています。datetimepickers から値を取得する 2 つのパラメーター「@dt」と「@dt2」があります。ストアドプロシージャを実行するたびに、「文字列から日時を変換するときに変換に失敗しました」というエラーが表示されます。

クエリを実行した後、データグリッドビューに表示したいと思います。

私は問題を理解することができません..ここに私の手順とコードがあります

ストアド プロシージャ

ALTER proc [dbo].[deepak_proc]

( @dt 日時、@dt2 日時)

なので

@cols を NVARCHAR(MAX) として宣言します。

@query AS NVARCHAR(MAX) を宣言します

@cols = を選択

              STUFF((SELECT ',' + QUOTENAME(date +'_'+Logname) 
                from
                (
                  select K_date,
                    convert(char(10),K_date, 101) date, 
                    LogName
                  from kq_report_analyze
                  cross apply
                  (
                    select 'In' LogName
                    union all
                    select 'Out' 
                  ) l
                ) s   
                group by convert(char(10), K_date, 112), date, Logname
                order by convert(char(10), K_date, 112)
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

@クエリを設定

= 'SELECT empid, name, status, '+@cols+' FROM (SELECT empid, name, status, 
   doortime, date + "_" + col AS col_names FROM  (SELECT k_userid
   AS [empid], K_Name AS name, k_description1 as [status], K_WorktimeUp1
   AS [IN], K_WorktimeDown1 AS OUT, CONVERT(char(10), K_Date, 101) AS
  date FROM  dbo.kq_report_analyze WHERE (K_Date BETWEEN '+@dt+' AND
  '+@dt2+') GROUP BY K_UserID, K_Name, k_description1, K_Date,
  K_WorktimeUp1, K_WorktimeDown1) src  UNPIVOT (doortime FOR col IN
  ([IN], [OUT])) unpiv) 
  p PIVOT (max(doortime) FOR col_names IN ('+@cols+')) piv;'

実行(@クエリ)

そして、次のコードはボタンクリック時です

SqlConnection con = new SqlConnection(); con.ConnectionString = @"データ ソース=.\SQLEXPRESS;初期カタログ=test_db;ユーザー ID=user;パスワード=password";

     con.Open();


       SqlCommand cmd = new SqlCommand("deepak_proc", con);


   cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@dt", SqlDbType.DateTime).Value = dateTimePicker1.Value.ToString("MM/dd/yyyy");

cmd.Parameters.Add("@dt2", SqlDbType.DateTime).Value = dateTimePicker2.Value.ToString("MM/dd/yyyy");

DataTable dt = 新しい DataTable();

cmd.ExecuteNonQuery();

sda.Fill(dt);

dataGridView1.DataSource = dt;

con.Close();

4

5 に答える 5

0

cmd.Parameters.Add( "@ dt"、SqlDbType.DateTime).Value = DateTime.ParseExact(dateTimePicker1.Value.Tostring()、null);

cmd.Parameters.Add( "@ dt2"、SqlDbType.DateTime).Value = DateTime.ParseExact(dateTimePicker2.Value.Tostring()、null);

于 2013-03-23T12:05:23.243 に答える
0

クライアントの DateTimepicker から日付の文字列表現を取得しているように聞こえます。DateTimepicker から値を取得したら、それを正真正銘の CLR Date オブジェクトclient-sideに変換します。SQL 型にマップされる CLR 型がある場合は、文字列をバックエンドに渡さないでください。コマンド オブジェクトをクライアント側で構築するときに、適切なパラメータ タイプを選択します。

一般に、日付は日付として保持し、人間の目で表示する必要がある場合にのみ文字列に変換します。

編集:例:

        SqlClient.SqlParameter  p0;

        p0.ParameterName = "@startdate";
        p0.SqlDbType = SqlDbType.DateTime;
        p0.Value =  < a datetime object, not a string>  
        p0.Direction = ParameterDirection.Input;

次に、パラメーターを Parameters コレクションに追加します。

于 2013-03-23T10:34:46.220 に答える
0

日時を標準の yyyy-MM-dd 形式に渡すようにしてください。

于 2013-03-23T09:35:50.567 に答える
0

sp_executesqlシステム ストアド プロシージャを使用、変数をパラメーターとして配置します。

SET @query
= 'SELECT empid, name, status, ' + @cols + ' 
   FROM (SELECT empid, name, status, doortime, date + ''_'' + col AS col_names 
         FROM  (SELECT k_userid AS [empid], K_Name AS name, 
                       k_description1 as [status], K_WorktimeUp1 AS [IN], 
                       ktimeDown1 AS OUT, CONVERT(char(10), K_Date, 101) AS date 
                FROM  dbo.kq_report_analyze 
                WHERE (K_Date BETWEEN @dt AND @dt2) 
                GROUP BY K_UserID, K_Name, k_description1, K_Date, K_WorktimeUp1,
                         K_WorktimeDown1) src  
   UNPIVOT (doortime FOR col IN ([IN], [OUT])) unpiv) p 
   PIVOT (max(doortime) FOR col_names IN (' + @cols + ')) piv;'

EXEC sp_executesql @query, N'@dt datetime, @dt2 datetime', @dt, @dt2
于 2013-03-23T10:59:28.280 に答える
0
DateTime myDateTime = Convert.ToDateTime(dateTimePicker1.Value);

cmd.Parameters.Add(new MySql.Data.MySqlClient.MySqlParameter
("@myDateTime", MySql.Data.MySqlClient.MySqlDbType.DateTime));
 cmd.Parameters["@myDateTime"].Value = myDateTime;
于 2013-03-23T11:38:09.620 に答える