La conversion d'un type de données varchar à un type de données datetime entraîné dans une plage de valeur d'erreur
La conversion d'un type de données varchar à un type de données datetime entraîné dans une plage de valeur d'erreur
Je suis en train de saisir des données dans ma table à l'aide d'un formulaire, les formats de date à la fois la validation du formulaire et sql server sont les deux dd/mm/yy, cependant lorsque j'essaie d'envoyer des données à partir de la forme avec un jour de plus de 12 (par exemple, 13/12/2012), il déclenche une exception dont la cause est "La conversion d'un type de données varchar à un type de données datetime entraîné dans une plage de valeur de l'erreur", et si j'essaie de saisir des données dans la forme mm/jj/aa format il est dit: "mauvais format de date" qui est supposé signifie que le jj/mm/aa format est le format correct
voici le code de mon formulaire ci-dessous:
private void btnAddProject_Click(object sender, EventArgs e)
{
DateTime startDate;
DateTime endDate;
if (txtProjectName.Text == "") //client side validation
{
MessageBox.Show("Enter Project Name");
return;
}
try
{
startDate = DateTime.Parse(txtProjectStart.Text);
endDate = DateTime.Parse(txtProjectEnd.Text);
}
catch (Exception)
{
MessageBox.Show("Wrong Date Format");
return;
}
fa.CreateProject(txtProjectName.Text, startDate, endDate, (int)cbCustomers.SelectedValue, ptsUser.Id);
txtProjectName.Text = "";
txtProjectStart.Text = "";
txtProjectEnd.Text = "";
cbCustomers.SelectedIndex = 0;
MessageBox.Show("Project Created");
adminControl.SelectTab(2);
}//end btnAddProject
Et c'est le code dans mon DAO:
public void CreateProject(string name, DateTime startDate, DateTime endDate, int customerId, int administratorId)
{
string sql;
SqlConnection cn;
SqlCommand cmd;
Guid projectId = Guid.NewGuid();
sql = "INSERT INTO Project (ProjectId, Name, ExpectedStartDate, ExpectedEndDate, CustomerId, AdministratorId)";
sql += String.Format("VALUES('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, name, startDate, endDate, customerId, administratorId);
cn = new SqlConnection(Properties.Settings.Default.WM75ConnectionString);
cmd = new SqlCommand(sql, cn);
try
{
cn.Open();
cmd.ExecuteNonQuery();
}
catch (SqlException ex)
{
throw new Exception("Error Creating Project", ex);
}
finally
{
cn.Close();
}
}//end CreateProject Method
C'est mon code pour mon façade:
public void CreateProject(string name, DateTime startDate, DateTime endDate, int customerId, int administratorId)
{
dao.CreateProject(name, startDate, endDate, customerId, administratorId);
}//end CreateProject
OriginalL'auteur Aaron Mohammed | 2012-09-12
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous ne devriez pas être en train de passer le
DateTime
valeurs chaînes dans votre SQL. Utiliser SQL paramétrée, et il suffit de régler la valeur du paramètre directement. Vous devriez toujours utiliser SQL paramétrée aussi loin que possible:En outre, la gestion des exceptions est inutilement complexe. Il suffit d'utiliser un
using
déclaration, et de laisser leSqlException
bulle directement - pourquoi s'embêter en l'enveloppant dans une vanilleException
?OriginalL'auteur Jon Skeet
Vous pouvez faire sqldatetime de conversion comme
sqldatetime
OriginalL'auteur Baskaran
Une suggestion : pourquoi êtes-vous à l'aide de
Insert
déclaration dans votre code? Vous pouvez avoir une procédure stockée à la place.La solution est de convertir le datetime "jj-MMM-aaaa". sql = "INSERT INTO Projet (ProjectId, Nom, ExpectedStartDate, ExpectedEndDate, CustomerId, AdministratorId)"; sql += String.Format("VALEURS('{0}', '{1}', '{2}', '{3}', {4}, {5})", projectId, nom, date de début.toString("jj-MMM-aaaa"), la date de fin.toString("jj-MMM-aaaa"), le code client, administratorId);
C'est un mauvais la solution. Beaucoup de mieux la solution est d'éviter les conversions de chaînes.
ensuite, vous pouvez utiliser le CulturInfo.
C'est en supposant que la base de données utilise la même culture que le système. Pourquoi voulez-vous sauter à travers compliqué cerceaux pour créer un fragile solution quand il y a un simple et la solution qui est plus propre et ? En séparant les valeurs de paramètre de la requête SQL est simplement de bonne pratique - pour tous les types.
OriginalL'auteur PQubeTechnologies