使用DataReader从SQL访问数据

时间:2013-10-14 09:25:14

标签: c# asp.net sql-server iis-8

我在DB中的数据库在dll中是这样的

    static SqlConnection cnn;
    static SqlDataReader reader;
    public string StorePass;
    public string  pass;
    byte[] tmpSource;
    byte[] tmpHash;
    public int  user;
    //static ArrayList list;
    static string connect = @"Server=.;database=Intranet;Integrated Security=true";

    public static void open()
    {
        cnn = new SqlConnection();
        cnn.ConnectionString = connect;
        try
        {
            cnn.Open();
        } //open connection
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.Source);

            Console.WriteLine("unable to open");
        }
    }
    public bool login(int usr, string pass)
    {
        user = usr;
        this.pass = pass;
        string temppass;
        tmpSource = ASCIIEncoding.ASCII.GetBytes(pass);
        tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
        temppass = ByteArrayToString(tmpHash);
        DB.open();
        StorePass = DB.retrievePass(user);
        bool bEqual = false;
        bEqual = String.Equals(temppass, StorePass, StringComparison.Ordinal);

        if (bEqual)
        {

            return true; 
        }

    }
    static string ByteArrayToString(byte[] arrInput)
    {
        int i;
        StringBuilder sOutput = new StringBuilder(arrInput.Length);
        for (i = 0; i < arrInput.Length - 1; i++)
        {
            sOutput.Append(arrInput[i].ToString("X2"));
        }
        return sOutput.ToString();
    }

    private static string retrievePass(int user)
    {
        using (cnn)
        {
            string pass = "";
            string table = "Login_Table";
            string strSQL = string.Format("Select * From {0} where UID = '{1}'", table, user);
            SqlCommand myCommand = new SqlCommand(strSQL, cnn);
            cnn.Open();
            reader = myCommand.ExecuteReader();
            /*while (reader.Read())
            {
                pass = reader["Hashed_Password"].ToString();
            }*/
            try
            {
                reader.Read();
                pass = reader["Hashed_Password"].ToString();
                reader.Close();
                return pass;

            }
            catch
            {
                reader.Close();
                return null;
            }
        }
    }  

我从网站上调用上述方法的aspx.cs是

    DB ob;
protected void Page_Load(object sender, EventArgs e)
{
    ob = new DB();
    DB.open();
}
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
    try
    {

        int id = int.Parse(Login1.UserName);

        string pass = Login1.Password;
        if (ob.login(id, pass))
        {
            Session["user"] = ob;
            this.Session["UserName"] = Login1.UserName;

            Response.Redirect("Post_View.aspx");
        }
    }
    catch(Exception ex)
    {
        throw;
    }

}
protected void LoginButton_Click(object sender, EventArgs e)
{

}

以上代码可以从visual studio中很好地模拟。但是当在IIS 8中部署时,它显示用户'IIS APPPOOL \ .NET v2.0'的登录失败错误。请帮助我,因为在IIS中部署的其他代码也写在类似的显示错误。我是否需要更改我的代码?在此先感谢

我的堆栈跟踪

      Server Error in '/Test' Application.

     Login failed for user 'IIS APPPOOL\.NET v2.0'.

   Description: An unhandled exception occurred during the execution of the current web     request. Please review the stack trace for more information about the error and where it originated in the code. 

   Exception Details: System.Data.SqlClient.SqlException: Login failed for user 'IIS APPPOOL\.NET v2.0'.

  Source Error: 


 Line 80:                 string strSQL = string.Format("Select * From {0} where UID = '{1}'", table, user);
 Line 81:                 SqlCommand myCommand = new SqlCommand(strSQL, cnn);
 Line 82:                 cnn.Open();
 Line 83:                 reader = myCommand.ExecuteReader();
 Line 84:                 /*while (reader.Read())

 Source File: e:\Demo\Intranet_DB\Intranet_DB\DB.cs    Line: 82 

 Stack Trace: 


 [SqlException (0x80131904): Login failed for user 'IIS APPPOOL\.NET v2.0'.]
 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +578
 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +88
 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +6322807
 System.Data.SqlClient.SqlConnection.Open() +258
 Intranet_DB.DB.retrievePass(Int32 user) in e:\Demo\Intranet_DB\Intranet_DB\DB.cs:82
 Intranet_DB.DB.login(Int32 usr, String pass) in    e:\Demo\Intranet_DB\Intranet_DB\DB.cs:51
  _Default.Login1_Authenticate(Object sender, AuthenticateEventArgs e) in c:\inetpub\wwwroot\Test\Default.aspx.cs:38
    System.Web.UI.WebControls.Login.AttemptLogin() +152
    System.Web.UI.WebControls.Login.OnBubbleEvent(Object source, EventArgs e) +124
    System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +70
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +29
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2981

2 个答案:

答案 0 :(得分:0)

检查您的连接字符串。您正在使用当前用户登录数据库,并且在IIS(IIS APPPOOL.NET v2.0)中运行应用程序池的用户无权访问该数据库。

你应该:

  1. 更改连接字符串并指定其他用户。
  2. 或,更改运行应用程序池的用户。

答案 1 :(得分:0)

  1. 使用.Net框架的确切版本创建自己的应用程序池。
  2. 使用用户名和密码修改连接字符串,不要将其与Windows身份验证一起使用。