【问题标题】:Count how many users are added to database计算有多少用户添加到数据库
【发布时间】:2020-04-29 06:47:51
【问题描述】:

我有一些代码从Active Directory 收集所有用户并将它们插入到我的数据库中。插入数据库中尚不存在的所有用户后,我想计算我添加到数据库中的新用户数量。

到目前为止,我想要创建的是执行存储过程的函数

 public void ExcStrPrc(string Username, string DisplayName, bool isEnable, bool PassNevExp)
        {
            SqlConnection conn = new SqlConnection(@"Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=DesignSaoOsig1;Integrated Security=True");
            SqlCommand cmd = new SqlCommand("ADProcTemp", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Username", Username.ToString().Trim());
            cmd.Parameters.AddWithValue("@DisplayName", DisplayName.ToString().Trim());
            cmd.Parameters.AddWithValue("@isEnabled", Convert.ToInt32(isEnable));
            cmd.Parameters.AddWithValue("@PassNevExp", Convert.ToInt32(PassNevExp));
            conn.Open();
            int k = cmd.ExecuteNonQuery();
            if (k != 0)
            {
                Console.WriteLine("Record Inserted Succesfully into the Database");

            }           
            conn.Close();
        }

这是我的主程序

        public static List<Korisnik> VratiKorisnike()
        {
            List<Korisnik> lstADUsers = new List<Korisnik>();
            string sDomainName = "saostest";
            string DomainPath = "LDAP://" + sDomainName;
            string fileLoc = @"C:\output.txt";

            DirectoryEntry searchRoot = new DirectoryEntry(DomainPath);
            DirectorySearcher search = new DirectorySearcher(searchRoot);

            search.Filter = "(&(objectClass=user)(objectCategory=person))";
            search.PropertiesToLoad.Add("samaccountname"); // Username
            search.PropertiesToLoad.Add("displayname"); // display name
            search.PropertiesToLoad.Add("userAccountControl");  // isEnabled
            search.PropertiesToLoad.Add("pwdLastSet"); //passwordExpires


            DataTable resultsTable = new DataTable();
            resultsTable.Columns.Add("samaccountname");
            resultsTable.Columns.Add("displayname");
            resultsTable.Columns.Add("Neaktivan");
            resultsTable.Columns.Add("dontexpirepassword");

            SearchResult result;
            SearchResultCollection resultCol = search.FindAll();


            if (resultCol != null)
            {
                for (int counter = 0; counter < resultCol.Count; counter++)
                {
                    string UserNameEmailString = string.Empty;

                    result = resultCol[counter];

                    if (result.Properties.Contains("samaccountname")
                        && result.Properties.Contains("displayname"))
                    {
                        int userAccountControl = Convert.ToInt32(result.Properties["userAccountControl"][0]);
                        string samAccountName = Convert.ToString(result.Properties["samAccountName"][0]);

                        int isEnable;
                        int Dont_Expire_Password;


                        if ((userAccountControl & 2) > 0)
                        {
                            isEnable = 0;
                        }
                        else
                        {
                            isEnable = 1;
                        }



                        if ((userAccountControl & 65536) > 0)
                        {
                            Dont_Expire_Password = 1;
                        }
                        else
                        {
                            Dont_Expire_Password = 0;
                        }


                        Korisnik korisnik = new Korisnik();
                        korisnik.Username = (result.Properties["samaccountname"][0]).ToString();
                        korisnik.DisplayName = result.Properties["displayname"][0].ToString();
                        korisnik.isEnabled = Convert.ToBoolean(result.Properties["userAccountControl"][0]);


                        DataRow dr = resultsTable.NewRow();
                        dr["samaccountname"] = korisnik.Username.ToString();
                        dr["displayname"] = korisnik.DisplayName.ToString();
                        dr["neaktivan"] = Math.Abs(isEnable);
                        dr["dontexpirepassword"] = Dont_Expire_Password;    

                        resultsTable.Rows.Add(dr);

                        // Poziva se store procedura
                        Program p = new Program();
                        p.ExcStrPrc(korisnik.Username.ToString().Trim(), korisnik.DisplayName.ToString().Trim(), Convert.ToBoolean(isEnable), Convert.ToBoolean(Dont_Expire_Password));

                        //Ukupan broj dodanih novih usera 
                        string connectionString = @"Data Source = (LocalDb)\MSSQLLocalDB; Initial Catalog = DesignSaoOsig1; Integrated Security = True";
                        System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString);
                        sqlConnection.Open();
                        System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand("SELECT COUNT(*) FROM [dbo].[tblZaposleni_AD]");
                        sqlCommand.Connection = sqlConnection;

                        int RecordCount = Convert.ToInt32(sqlCommand.ExecuteScalar());
                        Console.WriteLine("Ukupan broj dodanih novi usera:", sqlCommand);

                        lstADUsers.Add(korisnik);    
                    }
                }
                var json = JsonConvert.SerializeObject(resultCol, Formatting.Indented);
                var res = json;

                Console.WriteLine("Ispis uspjesno obavljen");
                Console.ReadLine();
                File.WriteAllText(fileLoc, json);    
            }
            return lstADUsers;
        }
    }
}

我在这里添加这些逻辑

string connectionString = @"Data Source = (LocalDb)\MSSQLLocalDB; Initial Catalog = DesignSaoOsig1; Integrated Security = True";
                    System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString);
                    sqlConnection.Open();
                    System.Data.SqlClient.SqlCommand sqlCommand = new System.Data.SqlClient.SqlCommand("SELECT COUNT(*) FROM [dbo].[tblZaposleni_AD]");
                    sqlCommand.Connection = sqlConnection;

                    int RecordCount = Convert.ToInt32(sqlCommand.ExecuteScalar());
                    Console.WriteLine("Ukupan broj dodanih novi usera:", sqlCommand);

但这是我没有得到任何结果(数字)的问题?谁能帮我解决这个问题?

存储过程

CREATE PROCEDURE ADProcTemp
@Username varchar(250),
@DisplayName varchar(70),
@isEnabled tinyint,
@PassNevExp tinyint
AS
set nocount on
BEGIN
    IF NOT EXISTS (SELECT TOP 1 PrezimeIme FROM [dbo].[tblZaposleni_AD] with (NOLOCK) WHERE NetworkLogin = @Username)                   
BEGIN
    IF(@isEnabled = 1)
   INSERT INTO [dbo].[tblZaposleni_AD](NetworkLogin,PrezimeIme,Status,PassNevExp)
   VALUES (@Username, @DisplayName, @isEnabled,@PassNevExp)
END
ELSE    
BEGIN
  UPDATE [dbo].[tblZaposleni_AD]  
  SET Status = @isEnabled
  WHERE NetworkLogin = @Username AND Status <> @isEnabled

END
END

【问题讨论】:

  • 你能告诉我们你的存储过程吗?
  • 当然。抱歉,我忘记添加了
  • @PeterCsala 我添加了
  • 使用SET NOCOUNT ON,您基本上会关闭返回受影响行的功能。您必须从存储过程中显式返回受影响的行数。您可以依赖 @@ROWCOUNT (stackoverflow.com/questions/1103260/…) 或依赖 OUTPUT INSERTED (stackoverflow.com/questions/4619343/…)
  • 还有什么办法吗?

标签: c# sql-server stored-procedures active-directory


【解决方案1】:

首先在您的存储过程中,您需要删除 SET NOCOUNT ON 以允许 sp 返回受影响的行数。

然后在你的 c# 代码中而不是

int RecordCount = Convert.ToInt32(sqlCommand.ExecuteScalar());

你需要调用它

int RecordCount = Convert.ToInt32(sqlCommand.ExecuteNonQuery());

来自 MSDN 文档:

ExecuteScalar

返回

对象

结果集中第一行的第一列,如果结果集为空,则为空引用(在 Visual Basic 中为 Nothing)。返回最多 2033 个字符。

ExecuteNonQuery

返回

Int32

受影响的行数。

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2017-12-28
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多