C# 连接级数据库-如何编辑表
使用c#,.net Framwork 4.5与12 尝试了解数据库访问的连接级别。C# 连接级数据库-如何编辑表,c#,sql,sql-server,stored-procedures,dll,C#,Sql,Sql Server,Stored Procedures,Dll,使用c#,.net Framwork 4.5与12 尝试了解数据库访问的连接级别。 这个问题有很长的解释 目前正在创建数据库、简单程序、用于数据库工作的dll和用于访问db的控制台应用程序 关于创建的几句话: 我的数据库下一步: 过程-GetPetName: ALTER PROCEDURE GetPetName ( @carId int, @petName char(10) OUTPUT ) AS SELECT @petName = PetName from Inventory wher
这个问题有很长的解释强> 目前正在创建数据库、简单程序、用于数据库工作的dll和用于访问db的控制台应用程序 关于创建的几句话: 我的数据库下一步: 过程-
GetPetName
:
ALTER PROCEDURE GetPetName ( @carId int, @petName char(10) OUTPUT )
AS
SELECT @petName = PetName from Inventory where CarId = @carId
同样在dll中,我为我的数据库创建了连接,在控制台应用程序中,我尝试使用这个dll中的方法
问题是,很少的方法不起作用,也不知道为什么——检查了几次方法,但都没有结果。还提供了更新信息和显示DB works中所有信息的方法
有问题的方法,以及我在这方面遇到的问题-描述如下:
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;
}
}
SQLParameterName为“petName”的SQLParameter在您的SQLParameterCollection中不存在。但据我所知,我使用过程GetPetName
返回petName
问题1-我是否正确理解db程序的用法?如果没有-请为我解释一下,如果是,为什么我会得到这样的结果
第二种方法是为在我的表中插入条目而创建的——下面我来介绍
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();
}
}
和第二个插入变量(使用某些实体)
当我尝试调用此方法时(注意:在调用方法之前,我得到了一个int值和3个字符串值),我得到了描述错误-第一个方法的“@mycarID”
的语法错误,第二个变量的PetName
的语法错误。但是,如果字符串值的所有参数都正常,那么这个参数有什么问题呢。还要检查(正如您看到的),表中使用了相同类型的变量
问题2-这个方法哪里错了,为什么不能取int参数
另外,在创建用于处理数据库的dll时,我发现,如果我不将dll中的方法用于其他项目,则无法检查dll中的方法的功能
附加问题-在创建DLL的过程中,是否有一些方法可以检查方法,或者我总是必须创建一些“支持”项目来并行检查我的DLL的可操作性?意味着如何在创建过程中逐步进行调试
一篇文章有很多问题,但把它们放在一起,以减少其他文章中问题的解释部分。在第一种方法中,将最后一行更改为:
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}
当然,它不应该这样做:您应该像以前一样使用参数。在存储过程中,您没有在执行commandBefore
ru毯名称=(string)cmd.parameters[“petName”].Value
应该执行命令。比如cmd.ExecuteNonQuery()代码>?是的,您还应该在参数名(string)cmd.Parameters[“@petName”].Value之前放置一个@
哦,真的,-现在这个有效了,不要现在我多么想念它。。。。谢谢,还有其他问题呢?谢谢-现在一切都好了,还有什么关于降低dll的建议呢?是否有某种方法或我必须始终创建“支持”项目?现在,我建议您创建“支持项目”,并学习如何熟练使用调试器。而不是阅读有关测试和单元测试框架的内容。
Where CarID = {1}