2016-03-21 8 views
0

Ich habe eine SQL Server-Abfrage; Wenn ich es in SQL Server ausführe, gibt es die erwarteten Ergebnisse zurück, wenn ich dieselbe Abfrage aus C# -Code aufrufe, um eine Datenmenge zu füllen, gibt es keine Ergebnisse. Was ist das Problem? My SQL-Abfrage ist als unten entlang Ergebnisse mit, wenn in SQL ServerSQL-Abfrage zeigt Ergebnisse, wenn auf SQL Server ausgeführt, aber wenn von C# -Code aufgerufen wird nicht Ergebnisse

SELECT 
    t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, 
    t0.AddedBy , 
    (SELECT 
     AVG(CAST(brandID AS bigint)) FROM brands) AS brandID_AVERAGE 
FROM 
    brands t0 
WHERE 
    t0.cdt >= '2013-11-15 00:00:00' 
    AND t0.cdt <='2013-11-15 23:59:59' 
GROUP BY 
    t0.brandID, t0.brandName, t0.cdt, t0.udt, t0.brandstatus, t0.AddedBy 

und meine Ergebnisse für die obige Abfrage ausgeführt werden, wenn in SQL Server auszuführen, sind:

brandID brandName cdt udt brandstatus AddedBy brandID_AVERAGE 
10 khasim 2013-11-15 19:14:18.123 2013-11-15 19:14:18.123 1 1 52778 
11 khasim 2013-11-15 19:14:18.123 2013-11-15 19:14:18.123 1 1 52778 
12 khasim 2013-11-15 19:14:18.123 2013-11-15 19:14:18.123 1 1 52778 
13 khasim 2013-11-15 19:14:18.123 2013-11-15 19:14:18.123 1 1 52778 
14 khasim 2013-11-15 19:14:18.123 2013-11-15 19:14:18.123 1 1 52778 
15 khasim 2013-11-15 19:14:18.123 2013-11-15 19:14:18.123 1 1 52778 
16 khasim 2013-11-15 19:14:18.123 2013-11-15 19:14:18.123 1 1 52778 

Aber wenn ich rufe die gleiche Sache aus C# mit command.Parameters.AddWithValue, mein Dataset ist immer null.

Mein C# -Code ist

private void button1_Click(object sender, EventArgs e) 
{ 
    checkedListBox1.Items.Clear(); 
    Cursor.Current = Cursors.WaitCursor; 

    string [email protected]"SELECT t0.brandID, t0.brandName, t0.cdt, t0.udt, 
     t0.brandstatus, t0.AddedBy, 
     (SELECT AVG(CAST (brandID AS bigint)) FROM brands) 
      AS brandID_AVERAGE FROM brands t0 
      WHERE t0.cdt >= @VALUE1 and t0.cdt <[email protected] 
      group by t0.brandID,t0.brandName,t0.cdt,t0.udt, 
         t0.brandstatus,t0.AddedBy"; 

    if (textBox1.Text != string.Empty && textBox2.Text != string.Empty) 
    { 
     if (checkBox1.Checked == false) 
     { 
      try 
      { 
       if (QueryB != string.Empty) 
       { 
        using (SqlConnection con = new SqlConnection(Properties.Settings.Default.connectionString)) 
        { 
         con.Open(); 
         SqlCommand cmd = new SqlCommand(QueryB, con); 

         if (checkBox6.Checked) 
         { 
          var sample1 = DateTime.ParseExact(textBox1.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd") + " " + dateTimePicker2.Value.ToString("HH:mm:ss tt"); 
          var sample2 = DateTime.ParseExact(textBox2.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("yyyy-MM-dd") + " " + dateTimePicker1.Value.ToString("HH:mm:ss tt"); 

          cmd.Parameters.AddWithValue("@Value1", sample1.ToString()); 
          cmd.Parameters.AddWithValue("@Value2", sample2.ToString()); 
         } 
         else 
         { 
          if (label2.Text.Contains("datetime")) 
          { 
           cmd.Parameters.AddWithValue("@Value1", DateTime.ParseExact(textBox1.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("MM-dd-yyyy") + " " + "00:00:00.000"); 
           cmd.Parameters.AddWithValue("@Value2", DateTime.ParseExact(textBox2.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture).ToString("MM-dd-yyyy") + " " + "23:59:59.999"); 
          } 
          else 
          { 
           cmd.Parameters.AddWithValue("@Value1", textBox1.Text); 
           cmd.Parameters.AddWithValue("@Value2", textBox2.Text); 
          } 
         } 

         DataSet ds = new DataSet(); 

         SqlDataAdapter da = new SqlDataAdapter(cmd); 
         cmd.ExecuteNonQuery(); 

         da.Fill(ds); 
         con.Close(); 

         dataGridView1.DataSource = ds.Tables[0]; 
         mysource = ds.Tables[0]; 
         dataGridView1.BindingContext = new BindingContext(); 
         foreach (DataGridViewColumn col in dataGridView1.Columns) 
         { 
          checkedListBox1.Items.Add(col.HeaderText.ToString()); 

         } 
+2

Sie wahrscheinlich eine harte codiert Apostroph auf der Vorderseite und am Ende jedes Datum brauchen. wie t0.cdt> = '@ VALUE1' – Chuck

+3

Verwenden Sie AddWithValue nicht, insbesondere wenn Sie einen DateTime-Wert übergeben wollen – Steve

+2

[Können wir AddWithValue() bereits beenden?] (http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already /) –

Antwort

2

Ich bin nicht sicher über Ihre Frage, aber es ist eine sehr wahrscheinliche Täter in Ihrem Code und es ist die AddWithValue Aufruf zusammen mit einem Datetime-Parameter.

Ihr Code wandelt den Datetime-Wert in eine Zeichenfolge um und übergibt sie an AddWithValue. Diese Konvertierung erfolgt mithilfe der Regeln Ihrer Gebietsschemaeinstellungen.
AddWithValue hat keine Ahnung über die Tatsache, dass die zugrunde liegende Datatable-Spalte eine DateTime ist und somit einen Parameter vom String-Typ erstellt. An diesem Punkt werden die Parameter an das Datenbankmodul übergeben, das den Zeichenfolgenwert zurück in DateTime konvertieren muss. Diese Konvertierung erfolgt anhand der Regeln, die für Ihre Datenbank festgelegt wurden. Wahrscheinlich ist ein Wert der Grund dafür, dass Ihre Abfrage fehlschlägt.

Verwenden Sie einfach die Add-Methode, die genaue Datentyp spezifiziert und lassen Sie die Datenbank-Engine

cmd.Parameters.Add("@Value1", SqlDbType.DateTime).Value = sample1.Date; //2013/11/15 00:00:00 
cmd.Parameters.Add("@Value2", SqlDbType.DateTime).Value = sample2.AddSeconds(86339); // 2013/11/15 23:59:59 
+0

ich habe es so geändert, wie du es vorgeschlagen hast, aber immer noch dasselbe – Tan

+0

Wahrscheinlich, weil die beiden datetime den gleichen Zeitpunkt darstellen und du brauchst ein ganzer Tag. Änderte ein wenig die Antwort über – Steve

+0

Ich verstand das Problem, ich verwende Datum und Uhrzeit als 15/11/2013 00:00:00 AM, das ist in Ordnung 15/11/2013 24:00:00 was nicht da ist SQL Server hat 15/11/2013 23: 59: 59.999 Dies ändert sich auf den nächsten Tag, aber meine Abfrage konvertiert nicht in das Datums- oder Uhrzeitformat, das das Problem verursacht. – Tan

0

Ich glaube, Sie müssen ersetzen cmd.ExecuteNonQuery() den Wert korrekt aus dem Parameter extrahieren; mit cmd.ExecuteReader()

obwohl ich keine Möglichkeit, Tests haben

+0

es ist nicht das Problem, wie ich Datenadapter verwende, schrieb ich diese Zeile aus Versehen .. – Tan

+0

Sie könnten versuchen, den Datenadapter herausziehen und versuchen Sie einfach, den Reader auszuführen, vielleicht Dinge zu verengen. Es tut mir so leid, dass ich nicht mehr helfen kann – Vincent

Verwandte Themen