2011-08-12 6 views
-5

SQL select 문을 사용하여 Access DB 배경에서 오는 것으로, SQL Server 데이터베이스에 데이터를 푸시하고 레코드를 업데이트하는 데 더 많은 작업이 필요합니다. SQL Server에서 레코드를 추가하는 방법을 처음으로 이해하려면 INSERT 명령이 포함 된 매우 긴 명령문이 필요했습니다. 이 말은 불필요하게 복잡해 보입니다. .NET을 사용하면 훨씬 간단해질 것입니다.SQL 서버 테이블에 간단한 행을 추가하거나 업데이트 할 수 없습니다.

내가 연구 등 그들 중 누구도 내 코드가에는 오류가 없다는 사실에도 불구하고 나를 위해 작동하지 DataTable, DataSet, SqlCommand, SqlAdapters, 여러 코드 샘플을 검토했습니다. 이 예제의 돌연변이가 너무 많아서 스택 오버플로에 도움이된다고 호소합니다.

다음은 내가하려는 일입니다.

  1. 연결합니다 SQL Server에 대한 외부 (작품!)
  2. 열기 단일 테이블이 Dongles 전화를 개최했다.
  3. 일련 번호를 기준으로 행을 확인하십시오.
  4. 존재하는 경우 레코드를 업데이트하십시오.
  5. 그렇지 않으면 새 레코드를 추가하십시오.

나는 작업 한 코드 샘플의 최신 변이를 제공하고 있습니다. 코드를 실행하기 전에 수동으로 데이터베이스에 레코드 하나를 추가하여 SerialNumber 인수가 일치하는 것을 확인했습니다. 아쉽게도 if (dt.Rows.Count > 0) 문은 false를 반환하고 업데이트가 시도되지 않습니다.

이제 저는 이것을 말할 것입니다 .... 각 필드를 업데이트하는 라인을 성공적으로 통과 한 다른 돌연변이를 시도했습니다. 그러나 Update() 함수가 호출되면 (성공적으로) 실제 데이터베이스에는 아무 것도 전파되지 않습니다. 여기

코드입니다 :

SqlCommand cmd = new SqlCommand("SELECT * FROM Dongles WHERE SerialNumber = " + m_dongle.SerialNumber, server.SQLConnection); 
SqlDataAdapter da = new SqlDataAdapter(cmd); 
SqlCommandBuilder cb = new SqlCommandBuilder(da); 

DataTable dt = new DataTable(); 
da.Fill(dt); 

if (dt.Rows.Count > 0) 
{ 
    dt.Rows[0]["IsLeased"] = m_dongle.IsLeased == true ? 1 : 0; 
    dt.Rows[0]["LeaseDaysRemaining"] = m_dongle.LeaseDaysRemaining; 
    dt.Rows[0]["DateAssigned"] = DateTime.Now; 
    dt.Rows[0]["ConfiguredBy"] = m_dongle.ConfiguredBy; 
    dt.Rows[0]["LicenseHolder"] = m_dongle.LicenseHolder; 
    dt.Rows[0]["ContactName"] = m_dongle.ContactName; 
    dt.Rows[0]["ContactPhone"] = m_dongle.ContactPhone; 
    dt.Rows[0]["ContactEmail"] = m_dongle.ContactEmail; 
    dt.Rows[0]["SerialNumber"] = m_dongle.SerialNumber; 
    dt.Rows[0]["IsNetworkDongle"] = m_dongle.IsNetworkDongle; 
    dt.Rows[0]["NetworkMaxUsers"] = m_dongle.NetworkMaxUsers; 
    dt.Rows[0]["NetworkAbsoluteMaxUsers"] = m_dongle.NetworkAbsoluteMaxUsers; 
    dt.Rows[0]["IsAssigned"] = m_dongle.IsAssigned; 
    dt.Rows[0]["DongleModel"] = m_dongle.DongleModel; 
    dt.Rows[0]["SalesforceID"] = m_dongle.SalesforceID; 

    da.Update(dt); 

    MessageBox.Show("Dongle profile updated successfully.", "Profile Saved", 
        MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
} 
+2

ado.net 및 DataTable을 당신이 마법을 사랑한다면 당신은, 예를 엔티티 프레임 워크를위한 도구 몇 가지 ORM의를 확인할 수 있습니다 당신을 위해 너무 복잡 경우 : –

+3

안녕하세요, JD, ** 답변을 수락하려면 답안 **의 왼쪽에있는 체크 박스 개요를 클릭하십시오. 사람들은 그 점을 높이 평가하고 미래에 더 기꺼이 도울 것입니다. 여기 많은 다른 사람들과 마찬가지로, 나는 당신을위한 해결책을 가지고 있지만 당신이 돌려주지 않기 때문에 그것을주지 않을 것입니다 ... 죄송합니다. –

+0

'where' 절없이 온전한 검사로 사용해보십시오. –

답변

4

열 어떤 종류의 SerialNumber입니까 ?? 문자열 열인 경우 매개 변수를 따옴표로 묶어야하며 SQL 주입 공격을 막으려면 SQL 문을 연결하는 대신 매개 변수가있는 쿼리 을 사용하십시오 (추가 혜택으로 , 매개 변수는 자동적으로) 필요한 값에 따옴표를 사용합니다 :

SqlCommand cmd = new SqlCommand("SELECT * FROM Dongles WHERE SerialNumber = @SerialNo", server.SQLConnection); 

cmd.Parameters.Add("@SerialNo", SqlDbType.VarChar, 50).Value = m_dongle.SerialNumber.Trim(); 

SqlDataAdapter da = new SqlDataAdapter(cmd); 
SqlCommandBuilder cb = new SqlCommandBuilder(da); 

DataTable dt = new DataTable(); 
da.Fill(dt); 

if (dt.Rows.Count > 0) 
{ 
    ....... 
} 
관련 문제