Hur ställer du in SqlParameter
? Du bör ställa in SqlDbType
egenskap till SqlDbType.DateTime
och skicka sedan DateTime
direkt till parametern (konvertera INTE till en sträng, du frågar efter en massa problem då).
Du bör kunna få in värdet i DB. Om inte, här är ett mycket enkelt exempel på hur man gör det:
static void Main(string[] args)
{
// Create the connection.
using (SqlConnection connection = new SqlConnection(@"Data Source=..."))
{
// Open the connection.
connection.Open();
// Create the command.
using (SqlCommand command = new SqlCommand("xsp_Test", connection))
{
// Set the command type.
command.CommandType = System.Data.CommandType.StoredProcedure;
// Add the parameter.
SqlParameter parameter = command.Parameters.Add("@dt",
System.Data.SqlDbType.DateTime);
// Set the value.
parameter.Value = DateTime.Now;
// Make the call.
command.ExecuteNonQuery();
}
}
}
Jag tror att en del av problemet här är att du är orolig för att det faktum att tiden är i UTC inte förmedlas till SQL Server. För det ändamålet borde du inte göra det, eftersom SQL Server inte vet att en viss tid är i en viss lokal/tidszon.
Om du vill lagra UTC-värdet, konvertera det till UTC innan du skickar det till SQL Server (såvida inte din server har samma tidszon som klientkoden som genererar DateTime
, och även då är det en risk, IMO). SQL Server kommer att lagra detta värde och när du får tillbaka det, om du vill visa det i lokal tid, måste du göra det själv (vilket är DateTime
struct kommer lätt att göra).
Allt som sagt, om du utför konverteringen och sedan passerar det konverterade UTC-datumet (datumet som erhålls genom att anropa ToUniversalTime
metod, inte genom att konvertera till en sträng) till den lagrade proceduren.
Och när du får tillbaka värdet ringer du ToLocalTime
metod för att få tiden i den lokala tidszonen.