Asp.net mvc 3 使用函数从表中返回一个值

Asp.net mvc 3 使用函数从表中返回一个值,asp.net-mvc-3,sql-server-2008,Asp.net Mvc 3,Sql Server 2008,我有以下代码: public int GetUserIdByEmail(string email) { using (SqlConnection conn = new SqlConnection(ZincModelContainer.CONNECTIONSTRING)) { using (SqlCommand cmd = conn.CreateCommand()) { conn.Open(); cmd.CommandType = System.Da

我有以下代码:

public int GetUserIdByEmail(string email)
{
  using (SqlConnection conn = new SqlConnection(ZincModelContainer.CONNECTIONSTRING))
  {
    using (SqlCommand cmd = conn.CreateCommand())
    {
      conn.Open();
      cmd.CommandType = System.Data.CommandType.Text;
      cmd.CommandText = String.Concat("SELECT [Zinc].[GetUserIdByEmail] (", email, ")");  //is this correct??? the problem lies here

      return (int)cmd.ExecuteScalar();
     } 
  }
}
我在上面的代码中得到了错误。这仍然是不对的 我现在有veljasije建议的以下功能
谢谢

首先,在存储过程中指定@Email参数的大小-如果没有它,它将默认为1个字符,因此不会尝试与您期望的值匹配。

始终明确指定大小以避免出现任何问题(例如,根据Marc_的评论,加上我在博客中提到的演示,在使用CAST/CONVERT时,其行为不同,但默认为30个字符)

第二,使用 e、 g

修改您的程序:

CREATE PROCEDURE [Zinc].[GetUserIdByEmail]
 (
   @Email varchar (100)
 )

 AS
 BEGIN

   SELECT zu.UserId from Zinc.Users zu WHERE Email = @Email

 END
在代码中,将参数类型从
NVarChar
更改为
VarChar

功能

CREATE FUNCTION [Zinc].[GetUserIdByEmail]
 (
   @Email varchar(100)
 )
 RETURNS int
 AS
 BEGIN

   DECLARE @UserId int;
   SET @UserId = (SELECT zu.UserId from Zinc.Users zu WHERE Email = @Email)

   RETURN @UserId                
 END

如果(dt.Rows.Count>0){userId=Convert.ToInt32(dt.Rows[0][“userId”]);}甚至更糟:一个
varchar
参数的默认长度是1个字符!30个字符的默认值适用于
CAST
CONVERT
…感谢您的catch@marc\s!完全正确,更正了我的答案。我应该有存储过程还是函数?我只想从users表中返回一个值,即:使用email地址的userId如果我们在数据库系统中谈论用户定义的函数,您可以自由地使用一个用户函数,两者都是这样做的,因为这里谈论的是just SELECT。但是,如果您需要修改数据库中的某些数据,则必须使用存储过程,因为它不允许通过用户定义的函数更改数据。ooo ok yes我只想返回一个值,但使用我现在的代码,我得到一个错误:多部分标识符“alias.field”无法绑定??是的,您可以同时使用这两个,仅当您执行select from database时。对于数据修改,您需要使用存储过程。如果您认为它真的对您有帮助,请将其作为答案放置。非常感谢,但我的OP中的代码仍然存在问题:)我收到该错误无法绑定多部分标识符“alias.field”??
CREATE FUNCTION [Zinc].[GetUserIdByEmail]
 (
   @Email varchar(100)
 )
 RETURNS int
 AS
 BEGIN

   DECLARE @UserId int;
   SET @UserId = (SELECT zu.UserId from Zinc.Users zu WHERE Email = @Email)

   RETURN @UserId                
 END