我有一个名为'MatchType'的表,它包含:
ID | MatchTypeName
1 | One Day
2 | Two Day
3 | T20
我有一种方法可以根据与MatchTypeName
中的值匹配的刺痛从该表中检索记录:
public static int GetByName(string matchType)
{
MatchType item = new MatchType();
using (SqlConnection con = new SqlConnection(BaseDataAccessLayer.GetConnectionStringByName()))
{
using (SqlCommand cmd = new SqlCommand(STORED_PROC_GetByName, con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@matchTypeName", SqlDbType.VarChar, 20).Value = matchType;
con.Open();
using (IDataReader reader = cmd.ExecuteReader())
{
item.LoadFromReader(reader);
}
}
}
return item.Id;
}
此方法调用此存储过程:
CREATE PROCEDURE [dbo].[MatchType_GetByName]
(@matchTypeName varchar(20))
AS
BEGIN
SET NOCOUNT ON
SELECT
[Id], [MatchTypeName]
FROM
[dbo].[MatchType]
WHERE
[MatchTypeName] = @matchTypeName
RETURN @@ERROR
END
调用GetByName
方法时,我传递的字符串为“One Day”。我通过调试确认了这一点。我无法发布有用的错误消息,因为没有生成。只是没有数据在阅读器中返回...
我还有其他一些使用类似过程的方法和存储过程,但它们都有效。我唯一能看到的是不同之处在于我在varchar / string值上使用WHERE
子句,这是其他查询不能做的事情......
然而,我可以运行此存储过程并返回所有记录..
BEGIN
SET NOCOUNT ON
SELECT
[Id],
[MatchTypeName]
FROM
[dbo].[MatchType]
RETURN @@ERROR
END
答案 0 :(得分:7)
声明没有大小的varchar
的默认长度是1.你在存储的proc参数中声明它就像那样,所以你只传递第一个字符。
更改您的声明:
(@matchTypeName varchar)
到相关尺寸:
(@matchTypeName varchar(20))
此外,在代码中添加大小并确保参数名称中的大小写与存储的proc相匹配:
cmd.Parameters.Add("@matchTypeName", SqlDbType.VarChar, 20).Value = matchType;
答案 1 :(得分:0)
该过程正在运行查询并显示结果(这就是它在SSMS中工作的原因),但实际上并没有返回任何内容。试试这个(注意,我还没有真正测试过它)。
CREATE PROCEDURE [dbo].[MatchType_GetByName]
@matchTypeName varchar(20),
@matchTypeID INT OUTPUT
AS
BEGIN
SET NOCOUNT ON
SELECT
@matchTypeID = [Id], [MatchTypeName]
FROM
[dbo].[MatchType]
WHERE
[MatchTypeName] = @matchTypeName
RETURN @@ERROR
END
答案 2 :(得分:0)
试试这个:
using (SqlCommand cmd = new SqlCommand(STORED_PROC_GetByName, con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@matchTypeName", matchType);
con.Open();
using (IDataReader reader = cmd.ExecuteReader())
{
item.LoadFromReader(reader);
}
}