Je développe une application de site Web C# VS 2008/SQL Server 2005 Express. J'ai essayé quelques-uns des correctifs pour ce problème, mais ma pile d'appels diffère des autres. Et ces correctifs n'ont pas résolu mon problème. Quelles mesures puis-je prendre pour résoudre ce problème?La conversion a échoué lors de la conversion de datetime à partir d'une chaîne de caractères
Voici mon erreur:
System.Data.SqlClient.SqlException was caught
Message="Conversion failed when converting datetime from character string."
Source=".Net SqlClient Data Provider"
ErrorCode=-2146232060
LineNumber=10
Number=241
Procedure="AppendDataCT"
Server="\\\\.\\pipe\\772EF469-84F1-43\\tsql\\query"
State=1
StackTrace:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at ADONET_namespace.ADONET_methods.AppendDataCT(DataTable dt, Dictionary`2 dic) in c:\Documents and Settings\Admin\My Documents\Visual Studio 2008\WebSites\Jerry\App_Code\ADONET methods.cs:line 102
Et voici le code correspondant. Lorsque j'ai débogué ce code, "dic" a seulement bouclé les 3 noms de colonnes, mais n'a pas regardé dans les valeurs de ligne qui sont stockées dans "dt", la table de données.
public static string AppendDataCT(DataTable dt, Dictionary<string, string> dic)
{
if (dic.Count != 3)
throw new ArgumentOutOfRangeException("dic can only have 3 parameters");
string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString;
string errorMsg;
try
{
using (SqlConnection conn2 = new SqlConnection(connString))
{
using (SqlCommand cmd = conn2.CreateCommand())
{
cmd.CommandText = "dbo.AppendDataCT";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = conn2;
foreach (string s in dic.Keys)
{
SqlParameter p = cmd.Parameters.AddWithValue(s, dic[s]);
p.SqlDbType = SqlDbType.VarChar;
}
conn2.Open();
cmd.ExecuteNonQuery();
conn2.Close();
errorMsg = "The Person.ContactType table was successfully updated!";
}
}
}
Voici mon SQL stocké proc:
ALTER PROCEDURE [dbo].[AppendDataCT]
@col1 VARCHAR(50),
@col2 VARCHAR(50),
@col3 VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TEMP DATETIME
SET @TEMP = (SELECT CONVERT (DATETIME, @col3))
INSERT INTO Person.ContactType (Name, ModifiedDate)
VALUES(@col2, @TEMP)
END
Le fichier d'entrée a 3 colonnes. Les deux premiers sont des varchars, mais le troisième est aussi varchar je pense, mais il est représenté par "3/11/2010". Dans ce fichier d'entrée, un exemple de ligne ressemble à: "Benjamin | breakfast | 3/11/2010". Et j'essaye de convertir ce champ de date d'une chaîne à un datetime ici dans mon SP. Est-ce que je vais dans le mauvais sens?
DataRow: col1 | col2 | col3 11 | A2 | 10.01.1978 12 | b2 | 10.02.1978 13 | c2 | 10.03.1978 14 | d2 | 10/04/1978
Votre code me prêter à confusion. Pourquoi passez-vous dans un dictionnaire avec un nombre fixe d'éléments, puis en utilisant un type de paramètre 'VarChar' quand il attend un type datetime? –
Quel type de données détenez-vous dans votre fichier dictionnaires et quelles sont les données dans le DataTable? J'ai une hypothèse, et une réponse, mais je dois m'en assurer. – TheGeekYouNeed
Le dictionnaire dic contient les 3 en-têtes de colonne; DataTable contient les valeurs de ligne du fichier d'entrée. Jon, j'essaie de lire le champ date en tant que varchar. Voir le code mis à jour et les commentaires à la fin. – salvationishere