【发布时间】:2014-08-28 03:23:51
【问题描述】:
通过 Web 服务连接时,我遇到了与 sql server management studio(SSMS) 的连接问题。
如果我在 SSMS 中使用帐户 xxx 登录,我可以执行存储过程。此用户 xxx 对存储过程以及此存储过程使用的所有表的权限是更改、控制、执行、引用、取得所有权和查看定义。我认为我需要的只是执行。没问题,存储过程运行良好。
然后,在我的 Web 服务中,我将其设置为运行此存储过程。我使用 javascript 和 SOAP 运行它。它返回一个错误。我已经测试过了,毫无疑问,服务代码和javascript都是正确的。我相信问题出在权限上,或者是 sql 中的一些配置。但是我不明白为什么使用有效的帐户通过 Web 服务连接到 sql 并不能让我运行这个存储过程。
我是否缺少有关 sql 权限的某些内容,例如不使用 SSMS 时。或者,有什么方法可以测试来自 C# 中的 Web 服务的连接?
这里有一些代码显示了我如何将它们全部链接起来。
Web 服务连接 (C#):
<connectionStrings>
<add name="TABLE_NAME" connectionString="Data Source=db_name\instance1;Connect Timeout=30;Initial Catalog=TABLE_NAME;User ID=xxx;PWD=****" />
</connectionStrings>
Web 服务代码 (C#):
[WebMethod]
public System.Data.DataSet FindThings(string params){
RegistrationDB RegDB = new RegistrationDB();
return RegDB.FindThings(connectionstring, DBHelper.Providers.SqlServer, params);
}
public DataSet FindThings(string connectString, DBHelper.Providers provider, string params){
DBHelper db = new DBHelper();
db.CreateDBObjects(connectString, provider);
DataSet ds;
try{
db.AddParameter("@parameters", params);
ds = db.GetDataSet("[dbo].[procedure_name]", CommandType.StoredProcedure, ConnectionState.Open);
ds.Tables[0].TableName = "Things";
ds.Tables[1].TableName = "YearParameters";
}
finally{
db.connection.Close();
}
return ds;
}
Javascript:
var webServiceUrl = "/test.asmx";
var soapEnv = "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
<soapenv:Body> \
<FindThings xmlns='http://tempuri.org/'> \
<params>" + varParams + "</params> \
</FindThings> \
</soapenv:Body> \
</soapenv:Envelope>";
$.ajax({
url: webServiceUrl,
type: "POST",
dataType: "xml",
data: soapEnv,
complete: getResult,
contentType: "text/xml; charset=\"utf-8\""
});
function getResult(result, status) {
if(status != "success"){
document.getElementById("results").innerHTML += "<p>Status: " + status + "</p>";
}
}
这就是我在网页上获得输出“状态:错误”的地方。
有人知道我应该如何解决这个问题吗?
【问题讨论】:
-
您的用户是否有权远程登录服务器?
-
您可以将所有服务器代码包装在 try-catch 中并将错误与 stach 跟踪记录到文件中,还是仅在调试模式下观看?
-
不确定远程登录,会检查。至于在 c# 中调试,我不确定是否可以这样做,因为需要将 Web 服务部署到与存储解决方案不同的位置。
-
如果你不能调试,你能不能在你的 web 服务中添加一个 catch 块来将异常写入文件,或者直接去你的 .asmx 页面并从他们那里调用方法,至少然后将特定的 SQL 错误写入网页(取决于您的设置,但这些应该很容易更改)
-
编辑 - 据我所知,所有用户都启用了远程登录访问。我将尝试使用 catch 进行调试,这是个好主意。至于直接从 .asmx 进行测试,在该页面上的测试下是消息“测试表单仅适用于来自本地计算机的请求。”
标签: c# sql web-services stored-procedures permissions