2014-04-30 4 views
0

다음 매개 변수를 사용하여 C# Webmethod에 몇 가지 매개 변수를 보냅니다. 데이터베이스 연결에 WebMethod 테스트 및이 코드가 제대로 한 데이터베이스가 그대로 작동 성공 또는 오류 메시지를AJAX를 통해 C# WebMethod로 백 슬래시 보내기

TestDb.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestDb.aspx.cs" Inherits="TestDb" %> 
<html> 
<head> 
    <script type="text/javascript" src="http://localhost/js/jquery-1.10.2.min.js"></script> 
    <script type="text/javascript"> 
     $(function() { 
      $("#BtnTestDb").click(function() { 
       $.ajax({ 
        type: "POST", 
        url: "TestDb.aspx/CheckDbConnection", 
        data: '{"ServerName":"' + $("#edtDbServer").val() + 
         '", "UserName":"' + $("#edtDbUser").val() + 
         '", "Password":"' + $("#edtDbPassword").val() + 
         '", "Database":"' + $("#edtDbName").val() + '"}', 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        success: function (response) { 
         alert("success: " + response.d) 
        }, 
        error: function (xhr, status, error) { 
         alert("error:" + error); 
        } 
       }); 
      }); 
     }); 
    </script> 
</head> 
<body> 
    <table cellpadding="0" cellspacing="4"> 
     <tr> 
      <td class="">Server</td> 
      <td><input type="text" id="edtDbServer" /></td> 
     </tr> 
     <tr> 
      <td>Username</td> 
      <td><input type="text" id="edtDbUser" /></td> 
     </tr> 
     <tr> 
      <td>Password</td> 
      <td><input type="text" id="edtDbPassword" /></td> 
     </tr> 
     <tr> 
      <td>Database</td> 
      <td><input type="text" id="edtDbName" /></td> 
      <td align="left"><input type="button" id="BtnTestDb" value="Test Connection" /></td> 
     </tr> 
    </table> 
</body> 
</html> 

TestDb.aspx.cs

using System; 
using System.Data.SqlClient; 
using System.Web.Services; 

public class TestDb: System.Web.UI.Page { 

    [WebMethod(EnableSession = true)] 
    public static string CheckDbConnection(string ServerName, string UserName, string Password, string Database) { 
     if (ServerName != "" && UserName != "" && Password != "" && Database != "") { 

      SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); 
      builder.DataSource = ServerName; 
      builder.UserID = UserName; 
      builder.Password = Password; 
      builder["Initial Catalog"] = Database; 
      SqlConnection conn = new SqlConnection(builder.ConnectionString); 
      try { 
       conn.Open(); 
       conn.Close(); 
       return "Ok"; 
      } catch (Exception ex) { 
       return "Error: " + ex.Message; 
      } 
     } else { 
      return "Error: Required fields are missing."; 
     } 
    } 
} 

을 반환 기본 인스턴스 (이름에 백 슬래시가 없음) 그러나 .\sqlexpress과 같은 데이터베이스 인스턴스가있는 경우이 코드가 손상됩니다.

문제 :

서버 이름 입력에 백 슬래시를 추가, WEBMETHOD는 입력을 허용하지 않으며 나에게주는 Internal server error 메시지.

그러나 두 개의 백 슬래시를 추가하여 (.\\sqlexpress) WEBMETHOD는 데이터를 수신하지만 지금은 서비스 측면에 두 개의 백 슬래시를 (정확히 .\\sqlexpress)

질문 : WebMethod에 단일 백 슬래시를 보낼 수있는 방법

특히 .\sqlexpress

주 :

클라이언트 측의 모든 백 슬래시를 두 개의 백 슬래시로 바꾸고 서버 측의 단일 백 슬래시로 바꿀 수 있음을 알고 있습니다. 나는 더 나은 해결책을 찾는 것이 바람직하다.

+0

잠깐, 말하지만. \\ sqlexpress가 서버 측에서 작동하지 않습니까? . \\ sqlexpress가 서버 측 문자열에있는 경우. \ sqlexpress로 이스케이프해야합니다. 내가 뭔가를 놓치지 않는 한. – MightyLampshade

+0

'builder.DataSource = @ ""+ ServerName;을 시도하십시오. – codingbiz

+0

@MightyLampshade, 어떻게 든 webmethod는 단일 백 슬래시 (일종의 사전 확인 일 수 있습니다)를 좋아하지 않지만 '\\'는 다음 단계에서 유효성 검사를 통과합니다. 두 개의 백 슬래시가 있기 때문에 유효하지 않게됩니다. – AaA

답변

0

@ 문자를 사용하면 피할 수없는 문자열을 만들 수 있습니다. 따라서 이스케이프 문자를 입력 할 수 없습니다 (서버가 백 슬래시를 넣음으로써 생각하는 것입니다).

예 :

string test = "This is a \r\n test"; 
Console.WriteLine(test); 

OUTPUT: 
This is a 
test 

string test2 = @"This is a \r\n test"; 
Console.WriteLine(test2); 

OUTPUT: 
This is a \r\n test 

나는 이것이 당신이 :-) 앞으로 나아갈 도움이 될 수 있기를 바랍니다.

+0

답변을 주셔서 감사합니다.하지만 첫 번째 부분은 javascript이고 javascript에는 @ modifier가 없습니다 문자열 동작을 변경합니다. – AaA