2011-04-10 55 views
5

下面是我的表格截图: Main table design插入后,只有一个字符数据库中插入 “串” 的

数据后插入 Data after insertion

代码在C#

SqlConnection con = new SqlConnection(connectionsession.Con); 
con.Open(); 
SqlCommand cmd = new SqlCommand("finalinsert", con); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.Add(new SqlParameter("@fid", SqlDbType.Int)).Value = flightsession.Sflightid; 
cmd.Parameters.Add(new SqlParameter("@fcid", SqlDbType.Int)).Value = flightsession.Sflightcostid; 
cmd.Parameters.Add(new SqlParameter("@ftid", SqlDbType.Int)).Value = flightsession.Sflighttimingid; 
cmd.Parameters.Add(new SqlParameter("@frdn", SqlDbType.Date)).Value = DateTime.Now.ToString("dd-MM-yyyy"); 
cmd.Parameters.Add(new SqlParameter("@ford", SqlDbType.Date)).Value = flightsession.Regdate; 
cmd.Parameters.Add(new SqlParameter("@uid", SqlDbType.Int)).Value = loginsession.Auser; 
cmd.Parameters.Add(new SqlParameter("@paid", SqlDbType.Int)).Value = "1"; 
cmd.Parameters.Add(new SqlParameter("@source", SqlDbType.VarChar)).Value = flightsession.Sscource; 
cmd.Parameters.Add(new SqlParameter("@destination", SqlDbType.VarChar)).Value = flightsession.Sdestination; 
cmd.Parameters.Add(new SqlParameter("@fn", SqlDbType.VarChar)).Value = flightsession.Sflightname; 
cmd.Parameters.Add(new SqlParameter("@fc", SqlDbType.VarChar)).Value = flightsession.Total; 
cmd.Parameters.Add(new SqlParameter("@fty", SqlDbType.VarChar)).Value = flightsession.Stype; 
cmd.Parameters.Add(new SqlParameter("@fcl", SqlDbType.VarChar)).Value = flightsession.Sflightclass; 
cmd.Parameters.Add(new SqlParameter("@ft", SqlDbType.Time)).Value =flightsession.Sflighttime; 
cmd.ExecuteNonQuery(); 
MessageBox.Show("Succesful"); 
con.Close(); 
flightreceipt ob18 = new flightreceipt(); 
ob18.ShowDialog(); 
this.Hide(); 

代码在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) 

我试图找出原因!但我卡住了。 记住我插入的所有格式都是字符串。 谢谢。

回答

23

在您的存储过程中,您的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 

您可能还需要更改数据类型在你的电话,以及包括长度,但ADO.NET 可能正确处理它。

+0

-Thanks alot :)我认为这个问题将被解决,但修改新的错误后,即将不能转换为日期时间格式的字符串:( – 2011-04-10 17:36:58

+0

你可以使用'DateTime.Now',而不是把它变成一个字符串,但这是我的猜测,因为我不知道是哪一个DateTime导致了一个问题。 – Talljoe 2011-04-10 17:38:44

2

根本原因是@Talljoe以及@Jethro提到的。

无论如何,你的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 

了解更多关于SqlConnection.Dispose()using(){} block

+0

@abatishchev: - 现在出现的错误无法将字符串转换为日期时间。 )是09:00:00.0000000,我的字符串是09:00:00 – 2011-04-10 17:54:55

+0

@pixelerator:在哪一列? – abatishchev 2011-04-10 18:08:12

+0

表时间的最后一列(7) – 2011-04-10 18:11:59

0

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

0

与变量的数据类型一起,您应该提及数据项的大小。例如:varchar(50)