C# 为什么我的web服务/存储过程将插入值截断为一个字符?

C# 为什么我的web服务/存储过程将插入值截断为一个字符?,c#,web-services,stored-procedures,C#,Web Services,Stored Procedures,我使用jQueryAjax将值发送到我的.NETWeb服务,该服务将这些值发送到存储过程。我遇到的问题是,无论我向web服务发送什么值,它们都会作为一个字符插入到我的数据库中。e、 g.“测试”变为“t” 我的接收表中没有一列的最大值集为1。使用Firefox的firebug,我已经确认我的ajax方法确实在向web服务发布预期的值 网络服务: [WebMethod] public void InsertAllVehicles(string Make, string Model, st

我使用jQueryAjax将值发送到我的.NETWeb服务,该服务将这些值发送到存储过程。我遇到的问题是,无论我向web服务发送什么值,它们都会作为一个字符插入到我的数据库中。e、 g.“测试”变为“t”

我的接收表中没有一列的最大值集为1。使用Firefox的firebug,我已经确认我的ajax方法确实在向web服务发布预期的值

网络服务:

 [WebMethod]
    public void InsertAllVehicles(string Make, string Model, string SubModel, decimal Liter, string Cylinder,string Fuel, string FuelDel, string Asp, string EngDesg)
    {

        using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["localConnectionString"].ConnectionString))
        {
            using (SqlCommand comm = new SqlCommand())
            {
                conn.Open();
                comm.Connection = conn;
                comm.CommandType = CommandType.StoredProcedure;
                comm.CommandText = "Vehicle_InsertAll";
                if (Make.Length >=1)
                    comm.Parameters.AddWithValue("@Make", Make);
                if (Model.Length >=1)
                comm.Parameters.AddWithValue("@Model", Model);
                if (SubModel.Length >=1)
                comm.Parameters.AddWithValue("@SubModel", SubModel);
                if (Liter != 91)
                    comm.Parameters.AddWithValue("@Liter", Liter);
                if (Cylinder.Length >= 1)
                comm.Parameters.AddWithValue("@Cylinder", Cylinder);
                if (Fuel.Length >= 1)
                comm.Parameters.AddWithValue("@Fuel", Fuel);
                if (FuelDel.Length >= 1)
                comm.Parameters.AddWithValue("@FuelDel", FuelDel);
                if (Asp.Length >= 1)
                comm.Parameters.AddWithValue("@Asp", Asp);
                if (EngDesg.Length != 0)
                    comm.Parameters.AddWithValue("@EngDesg", EngDesg);
                comm.ExecuteNonQuery();
                conn.Close();

            }
        }

    }
存储过程

ALTER PROCEDURE dbo.Vehicle_InsertAll
    @Make  varchar = null,
    @Model  varchar = null,
    @SubModel varchar = null,
    @Liter decimal = null,
    @Cylinder varchar = null,
    @Fuel varchar = null,
    @FuelDel varchar = null,
    @Asp varchar = null,
    @EngDesg varchar = null
AS
IF @Make IS NOT NULL
BEGIN
    INSERT INTO VehicleMakes (VehicleMake) VALUES(@Make)
    END
    IF @Model IS NOT NULL
    BEGIN
    INSERT INTO VehicleModels (Name) VALUES(@Model)
    END
    IF @SubModel IS NOT NULL
    BEGIN
    INSERT INTO VehicleSubModels (Name) VALUES(@SubModel)
    END
    IF @Liter IS NOT NULL
    BEGIN
    INSERT INTO VehicleLiters (Liters) VALUES(@Liter)
    END
    IF @Cylinder IS NOT NULL
    BEGIN
    INSERT INTO VehicleCylinders (Cylinders) VALUES(@Cylinder)
    END
    IF @Fuel IS NOT NULL
    BEGIN
    INSERT INTO VehicleFuel (FuelType) VALUES (@Fuel)
    END
    IF @FuelDel IS NOT NULL
    BEGIN
    INSERT INTO VehicleFuelDelivery (Delivery) VALUES (@FuelDel)
    END
    IF @Asp IS NOT NULL
    BEGIN
    INSERT INTO VehicleAspiration (Asp) VALUES (@Asp)
    END
    IF @EngDesg IS NOT NULL
    BEGIN
    INSERT INTO VehicleEngDesg (Designation) VALUES (@EngDesg)
    END

    RETURN

因为
VARCHAR
是一个字符。将其设置为
VARCHAR(MAX)
直到您知道真正需要的大小,用所需的大小替换MAX。

因为
VARCHAR
是一个字符。将其设置为
VARCHAR(MAX)
直到您知道您真正想要的大小,用您需要的大小替换MAX。

指定存储过程中每个字段的VARCHAR长度,例如@Make VARCHAR(50)=null

指定存储过程中每个字段的VARCHAR长度,例如@Make VARCHAR(50)=null

存储过程的参数,特别是具有varchar类型的参数,应该使用与表中定义的列相匹配的长度来声明。例如:@Make varchar(50)=null。

您的存储过程的参数,特别是具有varchar类型的参数,应该使用与表中定义的列相匹配的长度来声明。例如:@Make varchar(50)=null。

为了验证,您是否完全验证了您的javascript正在与charles/fiddler传递完整的句子?然后检查web参数中的变量是否使用visual studio调试器正确初始化?当我使用自己的值自行执行存储过程时,我发现存储过程是罪魁祸首。为了验证,您是否完全验证了您的javascript是否与charles/fiddler传递了完整的语句?然后检查web参数中的变量是否已使用visual studio调试器正确初始化?当我使用自己的值自行执行时,我发现存储过程是罪魁祸首。我只是将每个参数与其对应的列进行了匹配。@Nick~你不知道存储过程参数是如何工作的,是吗?我的建议是转到MSDN并仔细阅读它们。你做错了。我只是将每个参数与其对应的列进行了匹配。@Nick~你不知道存储过程参数是如何工作的,是吗?我的建议是转到MSDN并仔细阅读它们。你做错了。