2011-12-20 90 views
2

我有下面的代碼應該能夠獲得主鍵的表如何獲得一個表的SQL Server中的主鍵2008

public List<string> GetPrimaryKeysForTable(string tableName) 
    { 
     List<String> retVal = new List<string>(); 
     SqlCommand command = connector.GetCommand("sp_pkeys"); 
     command.CommandType = System.Data.CommandType.StoredProcedure; 
     command.Parameters.AddWithValue("@table_name", typeof(SqlChars)).Value = tableName; 
     SqlDataReader reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      retVal.Add(reader[3].ToString()); 
     } 
     return retVal; 
    } 

我有一個表在我的數據庫稱爲Users。當我通過Users作爲我的參數時,閱讀器不返回任何結果。任何想法爲什麼這可能無法返回我的主鍵?

+1

你確定你是對其中包含的數據庫中執行該命令的'用戶表(而不是'master'數據庫,例如)? – RoccoC5 2011-12-20 16:38:32

+1

您是否試過來自查詢分析器的「exec sp_pkeys Users」? – Aaron 2011-12-20 16:41:01

+0

嗨,你是否在這一行中獲得正確的值:retVal.Add(reader [3] .ToString());?您還可以指定列名稱而不是數字。這樣你可以做一些事情:retVal.Add(reader [「key」]。ToString());並且如果您試圖獲得正確的列值,會更容易判斷。 – Felipe 2011-12-20 16:43:23

回答

0

它需要用模式來限定嗎?喜歡的東西:

command.Parameters.AddWithValue("@table_name", typeof(SqlChars)).Value = "dbo." + tableName; 

或:

command.Parameters.AddWithValue("@schema", "dbo"); 

或者是有一些的parm你需要添加到告訴它在服務器內部的數據庫?

+1

感謝您的回覆。我試圖給這個鏡頭。仍然沒有運氣。我從其中一個註釋中提取了建議,並從查詢分析器中嘗試了存儲過程......它也沒有返回任何結果。然後,我嘗試使用合格的架構的建議,仍然沒有去... – user489041 2011-12-20 16:46:17

1

試試這個:

command.Parameters.Add("@table_name", SqlDbType.NVarChar).Value = tableName; 
+0

仍然沒有運氣。事實上,當我在Sql Management Studio中執行存儲過程並且它沒有返回結果時,我就會擔心。 – user489041 2011-12-20 16:55:24

1

它看起來就像你有一個問題,你的.AddWithValue()使用這可能會導致您的問題。請參閱下面的修復:

public List<string> GetPrimaryKeysForTable(string tableName) 
{ 
    List<string> retVal = new List<string>(); 
    SqlCommand command = connector.GetCommand("sp_pkeys"); 
    command.CommandType = System.Data.CommandType.StoredProcedure; 
    command.Parameters.AddWithValue("@table_name", tableName); 
    SqlDataReader reader = command.ExecuteReader(); 
    while (reader.Read()) 
    { 
     retVal.Add(reader[3].ToString()); 
    } 
    return retVal; 
} 

在你的榜樣,你試圖將@table_name添加爲一個類型,而不是一個字符串。

0

您可以簡單地使用如下,請你嘗試一下:

command.Parameters.AddWithValue("@table_name", ("dbo." + tableName)); 
0

存儲過程「sp_pkeys」有三個參數:

command.Parameters.Add("@table_name", SqlDbType.NVarChar).Value = tableName; 
command.Parameters.Add("@table_owner", SqlDbType.NVarChar).Value = tableOwner; 
command.Parameters.Add("@table_qualifier", SqlDbType.NVarChar).Value = tableQualifier; 

它適用於只是@table_name卻苦於嘗試通過所有三個,看看它是否有所作爲。

0

問題:你的表有沒有定義任何鍵?

我在我自己的測試數據庫運行略微修改後的代碼下面對Severa的表,它按預期工作:

static class Program 
{ 
    static void Main(string[] args) 
    { 
     var connStr = new SqlConnectionStringBuilder 
     { 
      DataSource = "localhost", 
      InitialCatalog = "RichTest", 
      IntegratedSecurity = true 
     }; 

     using (var conn = new SqlConnection(connStr.ToString())) 
     { 
      conn.Open(); 

      var parents = GetPrimaryKeysForTable(conn, "People"); 

      Console.WriteLine("Parent Keys:"); 
      foreach (var p in parents) 
      { 
       Console.WriteLine(" {0}", p); 
      } 
     } 
    } 

    static IList<string> GetPrimaryKeysForTable(SqlConnection conn, string tableName) 
    { 
     if (conn == null) throw new ArgumentNullException("Value is null", "conn"); 
     if (string.IsNullOrWhiteSpace(tableName)) throw new ArgumentNullException("Value is null or emtpy", "tableName"); 

     List<String> retVal = new List<string>(); 
     using (var command = new SqlCommand 
     { 
      Connection = conn, 
      CommandText = "sp_pkeys", 
      CommandType = CommandType.StoredProcedure 
     }) 
     { 
      command.Parameters.AddWithValue("@table_name", typeof(SqlChars)).Value = tableName; 
      SqlDataReader reader = command.ExecuteReader(); 
      while (reader.Read()) 
      { 
       retVal.Add(reader["COLUMN_NAME"].ToString()); 
      } 
     } 
     return retVal; 
    } 

} 
相關問題