【问题标题】:Stored procedure doesn't execute from a web service, but does in SSMS存储过程不从 Web 服务执行,但在 SSMS 中执行
【发布时间】: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


【解决方案1】:

如果您有权访问 SQL Server,您还可以查看那里记录的事件或运行 Profiler 跟踪。您认为用于连接 SQL Server 的用户可能不在您的部署计算机上。通过 try/catch 获取调试信息是一个很好的解决方案,只是给了你另一种选择。

【讨论】:

  • 嗨。我不是此服务器的数据库管理员,所以我认为我无权访问记录的事件。我不确定您所说的部署机器是什么意思。我绝对可以使用 SSMS 与用户一起登录到正确的服务器。另外,我已经检查了几次权限,它们似乎是正确的。有效权限看起来正在执行。
  • 更新:当我从 .asmx 网页测试 Web 服务时,我正在使用 fiddler。我发现此错误“对象引用未设置为对象的实例。”我将更新进一步的发现/修复。
  • 所以我发现,当 DbDataAdapter 对象执行 Fill 方法时,基本上我什么也没得到。基本上,要么我的连接错误,我的数据错误,要么数据库不允许用户运行查询。我仍然不明白,因为我有完全相同的代码工作,但在不同的数据库上。现在,我将存储过程存储到了这个新数据库上,我用来连接的用户具有执行权限,但它不起作用。我将不得不重新检查用户是否可以远程登录,或者检查数据库的配置差异。
【解决方案2】:

这可能是因为您的服务帐号已被删除。检查这个。我以前遇到过同样的问题。

【讨论】:

  • 您忘记将链接添加到您的答案中。
猜你喜欢
  • 1970-01-01
  • 2016-03-06
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
相关资源
最近更新 更多