C# 插入后,仅插入一个字符,即;“字符串”;在数据库中

C# 插入后,仅插入一个字符,即;“字符串”;在数据库中,c#,.net,sql-server,tsql,stored-procedures,C#,.net,Sql Server,Tsql,Stored Procedures,下面是我的桌面截图: 插入后的数据 C代码# 用于在SQL server 2008中创建过程的代码 ALTER procedure [dbo].[finalinsert] @fid int,@fcid int,@ftid int,@frdn date,@ford date,@uid int, @paid int,@source varchar,@destination varchar,@fc varchar,@fty varchar,@fcl varchar,@ft time(7) ,@fn

下面是我的桌面截图:

插入后的数据

C代码#

用于在SQL server 2008中创建过程的代码

ALTER procedure [dbo].[finalinsert] @fid int,@fcid int,@ftid int,@frdn date,@ford date,@uid int,
@paid int,@source varchar,@destination varchar,@fc varchar,@fty varchar,@fcl varchar,@ft time(7) ,@fn varchar
AS
INSERT INTO [shangrila].[dbo].[flight_reg_table]
           ([flight_id]
           ,[flight_cost_id]
           ,[flight_time_id]
           ,[flight_reg_date_now]
           ,[flight_on_reg_date]
           ,[user_id]
           ,[paid]
           ,[source]
           ,[destination]
           ,[flight_name]
           ,[flight_cost]
           ,[flight_type]
           ,[flight_class]
           ,[flight_time])
     VALUES
           (@fid,
           @fcid,
           @ftid,
           @frdn,
           @ford,
           @uid,
           @paid,
           @source,
           @destination,
           @fn,
           @fc,
           @fty,
           @fcl,
           @ft)
我试图找出原因!但是我被卡住了。 记住我插入的所有格式都是字符串。
谢谢。

在存储过程中,您的VARCHAR需要有一个与其关联的长度,例如
VARCHAR(50)
。默认长度为1,因此SQL只向存储过程发送一个字符

ALTER procedure [dbo].[finalinsert] @fid int ,@fcid int ,@ftid int ,@frdn date ,@ford date ,@uid int ,@paid int ,@source varchar(50) ,@destination varchar(50) ,@fc varchar(50) ,@fty varchar(50) ,@fcl varchar(50) ,@ft time(7) ,@fn varchar(50) AS 更改过程[dbo]。[finalinsert] @fid int ,@fcid int ,@ftid-int ,@frdn日期 福特日期 ,@uid int ,@paid int ,@source varchar(50) ,@destination varchar(50) ,@fc varchar(50) ,@fty varchar(50) ,@fcl varchar(50) ,@ft时间(7) ,@fn varchar(50) 作为
您可能还需要更改调用中的数据类型以包含长度,但ADO.NET可能会正确处理它。

根本原因由@Talljoe和@Jethro提及。

无论如何,如果您的C#代码看起来像这样,您的C#代码会更好:

using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand cmd = connection.CreateCommand())
{
    cmd.CommandText = commandName;
    cmd.CommandType = CommandType.StoredProcedure;

    ...
    cmd.Parameters.Add("@source", SqlDbType.VarChar, 50).Value = flightsession.Sscource;
    cmd.Parameters.Add("@destination", SqlDbType.VarChar, 50).Value = flightsession.Sdestination;
    cmd.Parameters.Add("@fn", SqlDbType.VarChar, 40).Value = flightsession.Sflightname;
    cmd.Parameters.Add("@fc", SqlDbType.VarChar, 50).Value = flightsession.Total;
    cmd.Parameters.Add("@fty", SqlDbType.VarChar, 50).Value = flightsession.Stype;
    cmd.Parameters.Add("@fcl", SqlDbType.VarChar, 50).Value = flightsession.Sflightclass;

    connection.Open(); // open just now!
    cmd.ExecuteNonQuery();
} // using block call Dispose() for each object locker to guarantee close of the connection

阅读有关和的更多信息。

您的存储过程varchar需要更改以显示字段的长度。Ie@fn varchar(50)。

除了变量的数据类型外,还应该提到数据项的大小。例如:varchar(50)

-非常感谢:)我认为问题会得到解决,但在修改新错误后,无法将字符串转换为日期时间格式:(您可能只需要使用
DateTime.Now
而不是将其转换为字符串。但这是我的猜测,因为我不知道是哪个DateTime导致了问题。@abatishchev:-新错误现在出现,无法将字符串转换为日期时间。时间数据库中的格式(7)是09:00:00.0000000,我的字符串是09:00:00@pixelerator:在哪个列中?@abatishchev:-我首先找到了它,使用datetime.parse方法datetime dt=datetime.parse(flightsession.Sflighttime)将其转换为datetime;然后再次将其转换为字符串dt.ToString(“HH:mm:ss”);感谢您建议使用和处置方法:)@pixelerator:您是否尝试过使用
SqlDbType.DateTime
而不使用
ToString()
?@abatishchev:-我没有尝试,我会尝试:)
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand cmd = connection.CreateCommand())
{
    cmd.CommandText = commandName;
    cmd.CommandType = CommandType.StoredProcedure;

    ...
    cmd.Parameters.Add("@source", SqlDbType.VarChar, 50).Value = flightsession.Sscource;
    cmd.Parameters.Add("@destination", SqlDbType.VarChar, 50).Value = flightsession.Sdestination;
    cmd.Parameters.Add("@fn", SqlDbType.VarChar, 40).Value = flightsession.Sflightname;
    cmd.Parameters.Add("@fc", SqlDbType.VarChar, 50).Value = flightsession.Total;
    cmd.Parameters.Add("@fty", SqlDbType.VarChar, 50).Value = flightsession.Stype;
    cmd.Parameters.Add("@fcl", SqlDbType.VarChar, 50).Value = flightsession.Sflightclass;

    connection.Open(); // open just now!
    cmd.ExecuteNonQuery();
} // using block call Dispose() for each object locker to guarantee close of the connection