DateTime jako parametr zapytania SQL

0

Witam.

Zainspirowany uwagą @abrakadaber w wątku http://4programmers.net/Forum/1205587 zacząłem testy z przekazywaniem daty przez parametr i pojawił się problem.
W ramach prób naskrobałem coś takiego:

			string host = @"SERWER\SQL";
            string user = "sa";
            string password = "XXX";
            string database = "TEST";

            SqlConnectionStringBuilder sqlConnectionstringBuilder = new SqlConnectionStringBuilder();
            sqlConnectionstringBuilder.DataSource = host;
            sqlConnectionstringBuilder.InitialCatalog = database;
            sqlConnectionstringBuilder.UserID = user;
            sqlConnectionstringBuilder.Password = password;

            DateTime from = DateTime.Parse("2010-01-01");
            DateTime to = DateTime.Parse("2016-01-01");

            using (SqlConnection sqlConnection = new SqlConnection())
            {
                sqlConnection.ConnectionString = sqlConnectionstringBuilder.ConnectionString;
                try
                {
                    sqlConnection.Open();
                    Console.WriteLine("Connected.\n");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

                Console.WriteLine("(1)");
                string sqlCommandString = string.Format("SELECT TOP 10 * FROM dokument WHERE Data BETWEEN '{0}' AND '{1}'", from, to);
                try
                {
                    using (SqlCommand sqlCommand = new SqlCommand(sqlCommandString, sqlConnection))
                    {
                        using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
                        {
                            while (sqlDataReader.Read())
                            {
                                Console.WriteLine(sqlDataReader[0].ToString());
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }

                Console.WriteLine("\n(2)");
                try
                {
                    sqlCommandString = "SELECT TOP 10 * FROM dokument WHERE Data BETWEEN '@from' AND '@to'";
                    using (SqlCommand sqlCommand = new SqlCommand(sqlCommandString, sqlConnection))
                    {
                        sqlCommand.Parameters.AddWithValue("@from", from);
                        sqlCommand.Parameters.AddWithValue("@to", to);
                        using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
                        {
                            while (sqlDataReader.Read())
                            {
                                Console.WriteLine(sqlDataReader[0].ToString());
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            Console.ReadKey(); 

Wynikiem działania jest:

Connected.

(1)
1
2
3
4
5
6
7
8
9
10

(2)
Conversion failed when converting date and/or time from character string. 

Jak jak widać przy zapytaniu z parametrem serwer zwraca błąd.
Podejrzałem profilerem przekazane zapytanie i wygląda tak:

exec sp_executesql N'SELECT TOP 10 * FROM dokument WHERE Data BETWEEN ''@from'' AND ''@to''',N'@from datetime,@to datetime',@from='2010-01-01 00:00:00',@to='2016-01-01 00:00:00'

Jak poprawnie przekazać datę przez parametr do zapytania?

0

Spróbuj na przykład '20160624'. Działało do serwera 2008 włącznie. Na wyższych nie sprawdzałem.

0

Tak powinno ci zadziałać:

sqlCommandString = "SELECT TOP 10 * FROM dokument WHERE Data BETWEEN '@from' AND '@to'";
using (SqlCommand sqlCommand = new SqlCommand(sqlCommandString, sqlConnection))
{
   SqlParameter fromParameter = new SqlParameter("@from", SqlDbType.DateTime);
   fromParameter.Value = from;
   sqlCommand.Parameters.Add(fromParameter);

   SqlParameter toParameter = new SqlParameter("@to", SqlDbType.DateTime);
   toParameter.Value = to;
   sqlCommand.Parameters.Add(to);

   using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
   {
      while (sqlDataReader.Read())
      {
         Console.WriteLine(sqlDataReader[0].ToString());
      }
   }
}
0

@DibbyDum
Wstawiłem coś takiego (poprawiłem sqlCommand.Parameters.Add(to) na sqlCommand.Parameters.Add(toParameter)

using (SqlCommand sqlCommand = new SqlCommand(sqlCommandString, sqlConnection))
{
	SqlParameter fromParameter = new SqlParameter("@from", SqlDbType.DateTime);
	fromParameter.Value = from;
	sqlCommand.Parameters.Add(fromParameter);

	SqlParameter toParameter = new SqlParameter("@to", SqlDbType.DateTime);
	toParameter.Value = to;
	sqlCommand.Parameters.Add(toParameter);
                     
	using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
	{
		while (sqlDataReader.Read())
		{
			Console.WriteLine(sqlDataReader[0].ToString());
		}
	}
} 

Przekazane zostaje identyczne zapytanie :

exec sp_executesql N'SELECT TOP 10 * FROM dokument WHERE Data BETWEEN ''@from'' AND ''@to''',N'@from datetime,@to datetime',@from='2010-01-01 00:00:00',@to='2016-01-01 00:00:00'

i kończy się tym samym błędem.
Z tego co gdzieś czytałem to nie trzeba deklarować typu parametru, program zrobi to "sam" na podstawie przekazanej zmiennej.


@Sadam2
Spróbowałem tak:

using (SqlCommand sqlCommand = new SqlCommand(sqlCommandString, sqlConnection))
{
	sqlCommand.Parameters.AddWithValue("@from", from.ToString("yyyyMMdd"));
	sqlCommand.Parameters.AddWithValue("@to", to.ToString("yyyyMMdd"));
	using (SqlDataReader sqlDataReader = sqlCommand.ExecuteReader())
	{
		while (sqlDataReader.Read())
		{
			Console.WriteLine(sqlDataReader[0].ToString());
		}
	}
} 

Wygenerowane zostało zapytanie:

exec sp_executesql N'SELECT TOP 10 * FROM dokument WHERE Data BETWEEN ''@from'' AND ''@to''',N'@from nvarchar(8),@to nvarchar(8)',@from=N'20100101',@to=N'20160101'

a program zwrócił błąd: Conversion failed when converting date and/or time from character string. .

1 użytkowników online, w tym zalogowanych: 0, gości: 1