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