iis 无法从ASP.NET Web方法连接到SQL SERVER

gv8xihay  于 2023-04-06  发布在  .NET
关注(0)|答案(1)|浏览(201)

我使用C# ASP.NET Webform应用程序,无法从ASP.NET Web方法连接到SQL Server。(框架4.6)
连接未打开。从非webservicce方法打开相同的安装程序。
我的连接字符串:
string constr = @“数据源= LAPTOP-IUDF 0 K61\BTFSQLSERVER;初始目录=测试;集成安全性=True”;
连接使用windows身份验证,但我认为WebMethod用户是基于IIS的,这就是它失败的原因。
问:如何将正确的IIS用户添加到SQL Server,以便conn不会失败。

8cdiaqws

8cdiaqws1#

好吧,你是在你的开发计算机上运行这个,还是你正在发布到一些运行IIS的实时或开发服务器上?
我的意思是,要设置连接,我假设您使用连接构建器,将连接设置添加到项目中,并且正在使用它?(您不会每次编写代码时都输入连接字符串,对吗?)
因此,为项目设置一个连接,并测试该连接。无论是桌面还是其他?您希望让Visual Studio为您构建和设置连接。然后在代码中,您可以反复使用该连接设置。
因此,从vs转到project-〉“your project name”属性。
所以这个:

当然,在这个“测试”项目中,我已经使用了“许多”连接,但是让我们创建一个新的连接。
现在,在Project中,选择Settings,我们得到:

因此,我们创建一个新的连接。

因此,请注意,不要键入您的计算机名称(在本例中,服务器名称是您的开发计算机)。
但是,还要注意我们如何进行测试连接。
好了,现在我们有了一个有效的连接,测试了连接。
但更重要的是,我们还没有写任何代码!!!
好了,现在让我们在代码中尝试/使用该连接。
比如说一个网格视图来显示一些酒店。
因此,在网格视图中拖放到页面。
所以,这个标记:

<asp:GridView ID="GridView1" runat="server"
            width="40%"
            CssClass="table table-hover">
        </asp:GridView>

下面是code behind:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        LoadGrid();
}

void LoadGrid()
{
    string strSQL =
        @"SELECT FirstName, LastName, City, HotelName, Description
            FROM tblHotels ORDER BY HotelName";
    using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.Hotel))
    {
        using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
        {
            conn.Open();
            DataTable rstData = new DataTable();
            rstData.Load(cmdSQL.ExecuteReader());
            GridView1.DataSource = rstData; 
            GridView1.DataBind();   
        }
    }
}

现在我们有了这个:

请注意,当您按照上述设置连接时?
Visual Studio会在Web配置中为您放置/创建此连接。
当然,在发布到生产服务器之前,您需要更改该连接,但要设置这样的连接,只需让Visual Studio为您创建此连接。
还要注意的是,我没有在上面输入我的计算机的名称,而是使用“.”来表示本地主机名。(这在Windows中的大多数地方都有效-即使在登录到服务器时,您不需要“域”名称,或者您不知道计算机的主机名。
如果你有几个开发人员并且使用github,这个设置也很好用(我们都有不同的计算机名称,但是使用“.”代替你的计算机名称意味着连接将适用于所有开发人员和他们的SQL Server本地运行副本。
我当然会启动SQL Studio管理,并仔细检查是否可以连接,当然也要检查SQL Server的“示例”。
默认值为“SQLEXPRESS”。
另外,请注意,您现在真的需要确保您不仅运行SQL Server(我们假设此讨论是本地的),还需要确保SQL浏览器服务也在运行。这一个:

既然你做开发,那么我假设你确保你的SQL Server的本地副本启用了tp/ip连接。

(我会启用所有3个)。
但是,如果您的本地SQL服务器设置的位和部分不工作?然后“测试连接”按钮将显示您没有一个有效的连接,无论如何,对吗?
现在,在你的问题标题中,你提到/注意到/建议/暗示你试图构建一个web方法调用?好吧,在web方法调用(终点)中使用连接与上面的代码没有任何不同-你的代码仍然可以自由使用你按照上面所做的设置和连接。
所以,如果我想要一个web方法(“真正”令人惊讶的是任何web方法都支持SOAP + xml,JSON,甚至通过URL使用URL的参数的REST调用)。
所以,现在让我们在web方法中使用该连接字符串。
所以,客户端代码- web方法调用(jQuery)。
我们有这个:

Enter HotelName: <asp:TextBox ID="txtHotel" runat="server" ClientIDMode="Static">
                    </asp:TextBox>
<br />
City = <asp:TextBox ID="txtCity" runat="server" ClientIDMode="Static">
        </asp:TextBox>
<asp:Button ID="cmdGetCity" runat="server" Text="Get City"
    CssClass="btn"
    OnClientClick="mygetcity();return false;"
    />

<script>
    function mygetcity() {

        var txtHotel = $('#txtHotel')
        $.ajax({
            type: "POST",
            url: "HotelShow.aspx/HotelCity",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify({ HotelName : txtHotel.val()}),
            dataType: "json",
            success: function (Data) {
                $('#txtCity').val(Data.d)
            },
            error: function (xhr, status, error) {
                var errorMessage = xhr.status + ': ' + xhr.statusText
                alert('Error - ' + errorMessage)
            }
        });
    }

</script>

代码隐藏:(soap、web方法(带头)还是rest?
这是可行的:

[WebMethod()]
public static string HotelCity(string HotelName)
{
    DataTable dtHotels = new DataTable();   
    using (SqlConnection con = 
        new SqlConnection(Properties.Settings.Default.Hotel)) 
    {
        string strSQL =
            "SELECT City FROM tblHotels WHERE HotelName = @HotelName";
        using (SqlCommand cmdSQL = new SqlCommand(strSQL, con))
        {
            cmdSQL.Parameters.Add("@HotelName",SqlDbType.NVarChar).Value = HotelName;
            con.Open();
            dtHotels.Load(cmdSQL.ExecuteReader());
        }
    }
    if (dtHotels.Rows.Count > 0)
        return dtHotels.Rows[0]["City"].ToString();
    else
        return "";            
}

我们现在看到/得到这个:

因此,无论是Web方法(端点),还是简单的代码,一旦在项目中建立了连接,您就可以测试连接,然后才可以开始编写代码。
因此,让VS为您构建和设置连接-它实际上只是鼠标点击,这将确保您在编写任何代码之前有一个工作连接字符串。

相关问题