C# 存储过程上的ExecuteOnQuery会导致其被删除

C# 存储过程上的ExecuteOnQuery会导致其被删除,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,这是一个奇怪的。我有一个Dev-SQL服务器,上面有存储过程,当与UAT-DB上的相同代码一起使用时,相同的存储过程会导致它删除自己 有人听说过这种行为吗 SQL代码: 使用示例整天都在工作。。。当我通过C访问它时,它会在UAT SQL数据库中删除自己,但不会在开发数据库中删除自己 C代码: 好的,我已经找到了答案。。。简单的时候你知道怎么做 我在这里看到了这个链接: 消失存储过程 因此,从我当时的最佳答案来看: select syo.name from syscomments syc jo

这是一个奇怪的。我有一个Dev-SQL服务器,上面有存储过程,当与UAT-DB上的相同代码一起使用时,相同的存储过程会导致它删除自己

有人听说过这种行为吗

SQL代码:

使用示例整天都在工作。。。当我通过C访问它时,它会在UAT SQL数据库中删除自己,但不会在开发数据库中删除自己

C代码:


好的,我已经找到了答案。。。简单的时候你知道怎么做

我在这里看到了这个链接:

消失存储过程

因此,从我当时的最佳答案来看:

select syo.name
from syscomments syc
  join sysobjects syo on
    syo.id = syc.id
where syc.[text] like '%DROP PROC%'
这给了我另外一个存储过程。。。sp_是_user_admin,这似乎不正确,所以我快速查看了一下

create procedure dbo.sp_is_user_admin
@username as varchar(20),
@isadmin as int OUTPUT
AS 
BEGIN

    declare @profile as varchar(20)

    select @profile = profile from CPUserData where username = @username

    if @profile = 'admin'
        BEGIN
        select @isadmin = 1
        END
    else
        BEGIN
        select @isadmin = 0
        END

END

--*********************************************************************************

-- Check if user is registered with the system
IF OBJECT_ID('dbo.sp_is_valid_user') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo.sp_is_valid_user
    IF OBJECT_ID('dbo.sp_is_valid_user') IS NOT NULL
        PRINT '<<< FAILED DROPPING PROCEDURE dbo.sp_is_valid_user >>>'
    ELSE
        PRINT '<<< DROPPED PROCEDURE dbo.sp_is_valid_user >>>'
END
我希望这对其他人有帮助


PS:DB Artisan令人讨厌,如果我的开发工具包中有完整的SQL Server,那么我想我可以使用探查器来查看这个调用;P我无法安装SQL Server 2008,因为我没有对Visual Studio进行正确的SP/更新,我认为这里无法解决它,令人讨厌

您正在使用的示例是调用与您的c代码不同的proc sp_is_user_admin。另外,您可能需要研究c中的USING关键字。此代码可能会泄漏所有连接。您的过程可以简化为设置@isvalid=0;从CPUserData中选择@isvalid=1,其中username=@username;因此不需要临时变量。另外,考虑移动CON.接近最后一个块。@克里斯。我刚刚更改为sp_为有效用户,谢谢。。遗憾的是,问题没有得到解决:这似乎是一个很长的机会,但由于您在添加存储过程时正在执行拖放创建,我将检查拖放代码是否意外地被复制/粘贴到过程主体中。可能是一个糟糕的复制粘贴工作,或其他什么。您正在保存数据库创建脚本吗?你能运行脚本在你的开发机器上重新创建数据库,看看它是否被复制吗?这不是删除脚本。。。谢谢你的提示,但我已经删除了,以防万一。。。。我在问题中还说,我想我可以通过使用示例整天运行它,没有问题,因此如果有drop语句,就会显示出来。只有通过C输入才会导致问题。
    public bool IsValidUser(string sUsername, ref string sErrMsg)
    {
        string sDBConn = ConfigurationSettings.AppSettings["StoredProcDBConnection"];

        SqlCommand sqlcmd = new SqlCommand();
        SqlDataAdapter sqlAdapter = new SqlDataAdapter();

        try
        {
            SqlConnection conn = new SqlConnection(sDBConn);
            sqlcmd.Connection = conn;
            conn.Open();

            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.CommandText = "sp_is_valid_user";

            // params to pass in 
            sqlcmd.Parameters.AddWithValue("@username", sUsername);

            // param for checking success passed back out 
            sqlcmd.Parameters.Add("@isvalid", SqlDbType.Int);
            sqlcmd.Parameters["@isvalid"].Direction = ParameterDirection.Output;

            sqlcmd.ExecuteNonQuery();

            int nIsValid = (int)sqlcmd.Parameters["@isvalid"].Value;

            if (nIsValid == 1)
            {
                conn.Close();
                sErrMsg = "User Valid";
                return true;
            }
            else
            {
                conn.Close();
                sErrMsg = "Username : " + sUsername + " not found.";
                return false;
            }
        }
        catch (Exception e)
        {
            sErrMsg = "Error :" + e.Source + " msg: " + e.Message;
            return false;
        }
    }
select syo.name
from syscomments syc
  join sysobjects syo on
    syo.id = syc.id
where syc.[text] like '%DROP PROC%'
create procedure dbo.sp_is_user_admin
@username as varchar(20),
@isadmin as int OUTPUT
AS 
BEGIN

    declare @profile as varchar(20)

    select @profile = profile from CPUserData where username = @username

    if @profile = 'admin'
        BEGIN
        select @isadmin = 1
        END
    else
        BEGIN
        select @isadmin = 0
        END

END

--*********************************************************************************

-- Check if user is registered with the system
IF OBJECT_ID('dbo.sp_is_valid_user') IS NOT NULL
BEGIN
    DROP PROCEDURE dbo.sp_is_valid_user
    IF OBJECT_ID('dbo.sp_is_valid_user') IS NOT NULL
        PRINT '<<< FAILED DROPPING PROCEDURE dbo.sp_is_valid_user >>>'
    ELSE
        PRINT '<<< DROPPED PROCEDURE dbo.sp_is_valid_user >>>'
END
// check the user is entitled to use the system at all 
if (usrData.IsValidUser(sCurrentUserName, ref sErrMsg))
{
    // if the user is admin then let them spoof and edit their own data 
    if (usrData.UserIsAdmin(sCurrentUserName, ref sErrMsg))
    {
        chkSpoof.Visible = true;
        grdvwUserDataFromDB.Visible = true;
    }
}
else
{
    // redirect them away
    Response.Redirect("UserNotRegistered.aspx");
    return;

}