【发布时间】:2020-06-04 02:46:59
【问题描述】:
我正在开发一个 SQL Server 数据库程序,它的界面上有 2 个dateTimePickers,用于选择 DOJ(加入日期)和 DOB(出生日期)。除了dateTimePickers,一切似乎都运行良好,它不断出现:
将 nvarchar 转换为日期时间时出错
我尝试将其更改为nvarchar(50) 和nvarchar(MAX),但随后出现了相同的错误。表单看起来像这样,还出现了错误:https://i.imgur.com/jEd69FM.png
这是 SQL Server 存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[StudentAdd]
@FirstName varchar(50),
@LastName varchar(50),
@CourseEnrolled varchar(250),
@Level int,
@DOJ datetime,
@DOB datetime
AS
INSERT INTO tblStudent (First_Name, Last_Name, Course_Enrolled, Level, DOJ, DOB)
VALUES (@FirstName, @LastName, @CourseEnrolled, @Level, @DOJ, @DOB)
C#代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
namespace final_assessment
{
public partial class Form4 : Form
{
public Form4()
{
InitializeComponent();
}
string connectionString = "Data Source=DESKTOP-SQ1V840;Initial Catalog=UserRegistration;Integrated Security=True";
private void button1_Click(object sender, EventArgs e)
{
try
{
using (SqlConnection sqlCon = new SqlConnection(connectionString))
{
sqlCon.Open();
using (SqlCommand sqlCmd = new SqlCommand("StudentAdd", sqlCon))
{
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.Parameters.AddWithValue("@FirstName", textBox1.Text.Trim());
sqlCmd.Parameters.AddWithValue("@LastName", textBox2.Text.Trim());
sqlCmd.Parameters.AddWithValue("@CourseEnrolled", textBox3.Text.Trim());
sqlCmd.Parameters.AddWithValue("@Level", textBox4.Text.Trim());
sqlCmd.Parameters.AddWithValue("@DOJ", dateTimePicker1.Text.Trim());
sqlCmd.Parameters.AddWithValue("@DOB", dateTimePicker2.Text.Trim());
sqlCmd.ExecuteNonQuery();
}
}
MessageBox.Show("Registration successful");
}
catch (Exception ex)
{
MessageBox.Show($"Error in the SQL Server \"StudentAdd\" procedure: {ex.Message}");
}
}
}
}
【问题讨论】:
-
问题可能不是文本的长度,而是 datetimepicker 的 DateTime 的格式被格式化为不同于 SQL Server 预期的字符串。使用带有
SqlDbType.DateTime的 SqlParameter 和来自 datetimepicker 控件的实际DateTime值。另见Can we stop using AddWithValue() already? -
那么我应该把代码放在哪里?我对这两个 cmets 感到很困惑,因为他们没有给我一个正确的真实答案,让我知道该怎么做
-
dateTimePicker1有Value属性吗?如果有,它的类型是什么? -
我怀疑你想使用
dateTimePicker1.Value而不是dateTimePicker1.Text.Trim()。
标签: c# sql-server winforms