2013-10-14 34 views
1
从SQL访问数据

我在C#这是在DLL DB是这样使用DataReader的

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 
+0

你可以发布一个屏幕截图,显示'IIS APPPOOL \ .NET v2.0'有权访问sql数据库吗? –

+0

@JeremyThompson我不能帮你吗?我们必须在IIS服务器上更改任何设置以访问特定的数据库 –

回答

0

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

您应该:

  1. 更改连接字符串,并指定一个不同的用户。
  2. 或更改运行应用程序池的用户。
+0

U是否意味着我应该在连接字符串中指定不同的服务器? –

+0

不,而是添加一个'User Id = myUsername; Password = myPassword;'指定您的用户名和密码。 – Szymon

+0

不起作用我再次收到相同的错误。 –

0
  1. 使用.Net框架的确切版本创建您自己的应用程序池。
  2. 使用用户名和密码修改您的连接字符串,请勿将其用于Windows身份验证。
+0

请解释如何创建自己的应用程序池? –

+0

从连接字符串中移除集成安全标签。它正在为SQL Server创建冲突。 – ZahidKakar

+0

删除集成安全性后出现错误为“连接未关闭,连接的当前状态已打开” –