从C#调用存储过程出现错误

3

我有以下C#代码来调用存储过程testproc,但是当我运行此应用程序时,它说找不到存储过程testproc

以下是我的C#代码用于调用存储过程:

SqlConnection con = new SqlConnection();
con.ConnectionString = "data source='example.com';user id='sa';password='password';persist security info=False;initial catalog=Test;Connect Timeout=100; Min Pool Size=100; Max Pool Size=500";
con.Open();

DataSet ds = new DataSet();
SqlCommand com = new SqlCommand("testproc",con );
SqlDataAdapter sqlda = new SqlDataAdapter(com);
//sqlda.SelectCommand.CommandText = "SELECT Id,Name1,ZipCode,StreetName,StreetNumber,State1,Lat,Lng,Keyword, ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) AS distance FROM Business_Details where( (StreetName like '%jayanagar%')and (Keyword like '%plumbing%' ))ORDER BY distance;";
//sqlda.CommandText = "select * from business where(( distance<'" + radius + "' )and (StreetName like '%" + streetname + "%')and (Keyword like '%" + keyword1 + "%' )) order by distance";
//com.CommandText = "testproc ";
com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add(new SqlParameter("@lat1",SqlDbType.Float,50,lat1));
com.Parameters.Add(new SqlParameter("@lng1",SqlDbType.Float,50,lng1));
com.Parameters.Add(new SqlParameter("@radius1",SqlDbType.Int,10,radius1));
com.Parameters.Add(new SqlParameter("@streetname", SqlDbType.VarChar, 50, streetname));
com.Parameters.Add(new SqlParameter("@keyword1", SqlDbType.VarChar, 50, keyword1)); 
com.Parameters[0].Value = lat1;
com.Parameters[1].Value = lng1;
com.Parameters[2].Value = radius1;
com.Parameters[3].Value = streetname;
com.Parameters[4].Value = keyword1;
try
{                
    sqlda.Fill(ds);
    con.Close();
}
catch (Exception e)
{
    con.Close();
}

这是我在SQL Server中编写的存储过程。它在SQL Server中成功运行。

USE [Test]
GO
/****** Object:  StoredProcedure [dbo].[tesproc]    Script Date: 09/01/2010 13:00:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 ALTER PROCEDURE [dbo].[tesproc]
    -- Add the parameters for the stored procedure here
    @a float, @b float, @d int,@s varchar(50),@k varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    select Id, Name1,ZipCode,StreetName,StreetNumber,State1,Lat,Lng , ( 6371 * ACOS( COS( (@a/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (@b /57.2958) )  + SIN( @a/57.2958 ) * SIN(  Lat/57.2958  ) ) ) as distance from business_details where (( 6371 * ACOS( COS( (@a/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (@b /57.2958) )  + SIN( @a/57.2958 ) * SIN(  Lat/57.2958  ) ) )<@d and StreetName like '%'+ @s + '%' and Keyword like '%'+ @k +'%')
END

4
我知道这是一个本地数据库,看起来像是测试密码,但你在发布连接详细信息时应该始终小心。 :) - DavidGouge
谢谢您的建议,从下一次开始我不会再发布任何连接细节。 - mahesh
4个回答

6
您的 ALTER 语句调用了 tesproc,但您的 SQL 命令调用了 testproc

谢谢回复,我无法追踪您的答案,请您能否更清楚些。 - mahesh
你的存储过程名字叫做tesproc,只有一个T。下面这行代码中testproc被拼写成了两个T:SqlCommand com = new SqlCommand("testproc",con );。其中一个是打字错误。我不能再更清楚了。 - LittleBobbyTables - Au Revoir
感谢您的回复,很抱歉我没有仔细注意到拼写错误。 - mahesh

5

谢谢您的回复,我完全没有注意到那个拼写错误。谢谢。 - mahesh

3

与其使用臃肿的代码

com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add(new SqlParameter("@lat1",SqlDbType.Float,50,lat1));
com.Parameters.Add(new SqlParameter("@lng1",SqlDbType.Float,50,lng1));
com.Parameters.Add(new SqlParameter("@radius1",SqlDbType.Int,10,radius1));
com.Parameters.Add(new SqlParameter("@streetname", SqlDbType.VarChar, 50, streetname));
com.Parameters.Add(new SqlParameter("@keyword1", SqlDbType.VarChar, 50, keyword1)); 
com.Parameters[0].Value = lat1;
com.Parameters[1].Value = lng1;
com.Parameters[2].Value = radius1;
com.Parameters[3].Value = streetname;
com.Parameters[4].Value = keyword1;

您正在重新为参数分配值

使用AddWithValue方法将参数添加到命令中

com.Parameters.AddWithValue("@lat1", lat1));
com.Parameters.AddWithValue("@lng1", lng1));
com.Parameters.AddWithValue("@radius1", radius1));
com.Parameters.AddWithValue("@streetname", streetname));
com.Parameters.AddWithValue("@keyword1", keyword1));

1
感谢您的建议,我已经对代码进行了更改。com.Parameters.AddwithValue("@lat1",lat1); 很有帮助,谢谢。 - mahesh

3
无论如何,您的代码应该像这样:
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlComamnd command = connection.CreateCommand())
{
    command.CommandText = commandText;
    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.Add("@lat1", SqlDbType.Float,50, lat1).Value = lat1;
    command.Parameters.Add("@lng1", SqlDbType.Float,50, lng1).Value = lng1;
    command.Parameters.Add("@radius1", SqlDbType.Int,10, radius1).Value = radius1;
    command.Parameters.Add("@streetname", SqlDbType.VarChar, 50, streetname).Value = streetname;
    command.Parameters.Add("@keyword1", SqlDbType.VarChar, 50, keyword1).Value = keyword1;

    connection .Open();
    DataSet ds = new DataSet();
    using (SqlDataAdapter adapter = neq SqlDataAdapter(command))
    {
        adapter.Fill(ds);                
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接