使用 c#,。net Framwork 4.5,VS 12
尝试了解数据库访问的连接级别 此问题有很长的解释!
目前创建数据库,简单程序,dll用于使用数据库,控制台应用程序用于访问db。
关于创建的几句话:
我的数据库接下来:
程序 - GetPetName
:
ALTER PROCEDURE GetPetName ( @carId int, @petName char(10) OUTPUT )
AS
SELECT @petName = PetName from Inventory where CarId = @carId
同样在dll我为我的数据库创建连接,并在控制台应用程序尝试使用此Dll中的方法。
问题是,很少有方法不起作用,并且不知道为什么 - 检查了几次方法,但没有结果。此外,还可以更新信息并显示数据库中的所有信息。
问题方法和我遇到的问题 - 如下所述:
使用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;
}
}
使用此方法,当我尝试调用它时收到错误消息 - 下一个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对一个帖子提出了很多问题,但是为了减少其他帖子中的问题的解释部分而把它放在一起。
答案 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}
嗯,它不应该:你应该像以前一样使用参数。