连接级别dataBase - 如何编辑表

时间:2013-11-28 20:04:17

标签: c# sql sql-server stored-procedures dll

使用 c#,。net Framwork 4.5,VS 12

尝试了解数据库访问的连接级别 此问题有很长的解释!

目前创建数据库,简单程序,dll用于使用数据库,控制台应用程序用于访问db。

关于创建的几句话:

我的数据库接下来:

enter image description here

程序 - GetPetName

ALTER PROCEDURE GetPetName  (   @carId int, @petName char(10) OUTPUT )
AS
SELECT @petName = PetName from Inventory where CarId = @carId

同样在dll我为我的数据库创建连接,并在控制台应用程序尝试使用此Dll中的方法。

问题是,很少有方法不起作用,并且不知道为什么 - 检查了几次方法,但没有结果。此外,还可以更新信息并显示数据库中的所有信息。

问题方法和我遇到的问题 - 如下所述:

  1. 使用DB程序的方法

    public string LookUpPetName(int CarID)
    {
        string CarPetName = string.Empty;
        using (SqlCommand cmd = new SqlCommand("GetPetName", this.sqlCn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
    
            SqlParameter param = new SqlParameter();
            param.ParameterName = "@carID";
            param.SqlDbType = SqlDbType.Int;
            param.Value = CarID;
            param.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(param);
    
            param = new SqlParameter();
            param.ParameterName = "@petName";
            param.SqlDbType = SqlDbType.Char;
            param.Size = 10;
            param.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(param);
    
            CarPetName = (string)cmd.Parameters["petName"].Value;
        }
        return CarPetName;
    }
    }
    
  2. 使用此方法,当我尝试调用它时收到错误消息 - 下一个desciprion SQLParameter with SQLParameterName "petName" don't exist in your SQLParameterCollection的问题。但据我所知,我使用我的程序petName返回GetPetName

    问题1 - 我是否正确理解了db中程序的使用?如果不是 - 请为我解释,如果是,为什么我得到这样的结果。

    第二种方法是为了在我的表中插入条目而创建的 - 这里是mede next

     public void InsertoAuto(int CarID, string Color,
            string Make, string PetName)
        {
            string sql = string.Format("Insert into Inventory"
                + " (CarID, Make, Color, PetName) Values"
                + ("@mycarID, @Make, @Color, @PetName"));
    
            using (SqlCommand sqlCommand = new SqlCommand(sql, this.sqlCn))
            {
                //add parameters - help to avoid attacks, 
                //make request a little bit faster
                SqlParameter param = new SqlParameter();
                param.ParameterName = "@mycarID";
                param.Value = CarID;
                param.SqlDbType = SqlDbType.Int;
                sqlCommand.Parameters.Add(param);
    
                param = new SqlParameter();
                param.ParameterName = "@Make";
                param.Value = Make;
                param.Size = 10;
                param.SqlDbType = SqlDbType.Char;
                sqlCommand.Parameters.Add(param);
    
                param = new SqlParameter();
                param.ParameterName = "@Color";
                param.Value = Color;
                param.Size = 10;
                param.SqlDbType = SqlDbType.Char;
                sqlCommand.Parameters.Add(param);
    
                param = new SqlParameter();
                param.ParameterName = "@PetName";
                param.Value = PetName;
                param.Size = 10;
                param.SqlDbType = SqlDbType.Char;
                sqlCommand.Parameters.Add(param);
    
                sqlCommand.ExecuteNonQuery();
            }
        }
    

    和插入的第二个变体(使用某些实体)

     public void UpdateCarPetName (int carId, string carName)
        {
            string sql = string.Format("Update Inventory Set PetName = '{0}' Where CarID = '{1}'",
                carName, carId);
            using (SqlCommand cmd = new SqlCommand(sql, sqlCn))
            {
                cmd.ExecuteNonQuery();
            }
        }
    

    当我尝试调用此方法时 - 两者(注意:我在调用方法之前得到一个int值和3个字符串值),我得到了描述错误 - incorrect syntacsis for "@mycarID"表示第一个方法而incorrect syntacsis for PetName表示错误第二个变种。但是如果所有参数都可以用于字符串值 - 那么这个参数是错误的。检查(如你所见),表格中使用了相同类型的变量。

    问题2 - 这个方法我错了,为什么我不能接受int参数?

    同样在创建用于处理我的dataBase的dll期间,如果我不在另一个项目中使用它,我无法在Dll中检查我的方法的功能。

    其他问题 - 是否有一些方法可以在创建DLL时检查方法,或者我总是必须创建一些“支持”项目来平行检查我的dll的可行性?意味着如何在创建过程中逐步进行调试?

    Thnik对一个帖子提出了很多问题,但是为了减少其他帖子中的问题的解释部分而把它放在一起。

1 个答案:

答案 0 :(得分:2)

在第一种方法中,将最后一行更改为:

cmd.ExecuteNonQuery();
CarPetName = (string)cmd.Parameters["@petName"].Value;

您没有执行该命令,还请注意参数名称前的@

在第二种方法中,您将括号保留在查询之外:

+ ("@mycarID, @Make, @Color, @PetName")); 

应该是

+ "(@mycarID, @Make, @Color, @PetName)");  // note the parenthesis inside the string

在第三种方法中,您将CarId与字符串进行比较

Where CarID = '{1}' 

应该是

Where CarID = {1} 

嗯,它不应该:你应该像以前一样使用参数。