2011-04-10 15 views
5

A continuación es mi mesa pantalla: Main table designDespués de insertar, sólo un carácter se inserta de "cadena" en la base de datos

de datos después de la inserción Data after insertion

Código en 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(); 

Código de procedimiento de creación en el servidor SQL 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) 

¡Intenté averiguar por qué! Pero estoy atrapado. Recuerde que todo el formato que estoy insertando es cadena. Gracias.

Respuesta

23

En su sproc, su VARCHAR necesita tener una longitud asociada, como VARCHAR(50). La longitud predeterminada es 1, por lo que SQL solo envía un carácter a tu sproc.

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 

También puede ser necesario cambiar el tipo de datos en su llamada así para incluir la longitud, pero ADO.NET podría manejarlo correctamente.

+0

-Gracias mucho :) Creo que el problema se resolverá pero después de modificar el nuevo error no se puede convertir la cadena al formato de fecha y hora :( –

+0

Probablemente pueda simplemente usar 'DateTime.Now' en lugar de convirtiéndolo en una cadena. Pero esa es mi suposición, ya que no sé qué DateTime está causando un problema. – Talljoe

2

La causa principal es mencionada por @Talljoe, así como por @Jethro.

De todos modos, su código C# será bastante mejor si va a tener este aspecto:

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 

Leer más sobre SqlConnection.Dispose() y using(){} block.

+0

@abatishchev: -Nuevos errores vienen ahora no se puede convertir la cadena a la fecha. El formato en mi base de datos de tiempo (7) es 09: 00: 00.0000000 y mi cadena es 09:00:00 –

+0

@pixelerator: ¿En qué columna? – abatishchev

+0

Última columna del tiempo de tabla (7) –

0

Su varchar de procedimiento almacenado debe cambiar para mostrar la longitud del campo. Es decir @fn varchar (50).

0

Junto con el tipo de datos de las variables, debe mencionar el tamaño del elemento de datos. Ejemplo: varchar (50)

Cuestiones relacionadas