4

たくさんの情報を収集するためにWindowsサービスを作成していて、それをDBに送信しています。私は他のテーブルでエラーなしでそれを使用したので、以下の方法論が機能することを知っています。しかし、DELETEコマンドを拡張して2つの条件を設定する必要があり、エラーが発生しました。

これは私が受け取ったエラーです:「変数名'@deletedrive'はすでに宣言されています。変数名はクエリバッチまたはストアドプロシージャ内で一意である必要があります。」

これが私のコードです(エンディングは、取得している例外をキャッチするだけなので省略されています。コメント行も無視してください):

private static void ServerSpaceTimerAction(object source, ElapsedEventArgs e, string InstallLocation)
    {
        //StreamWriter RecordServerSpace = new StreamWriter(InstallLocation + "\\Temp\\ServerSpaceTemp.csv");
        try
        {
            ServerSpace GetSpace = new ServerSpace();
            GetConfigurations Configs = new GetConfigurations();
            Configs.GetServers();
            Configs.GetDatabase();

            var connection = new SqlConnection("Data Source=" + Configs.DataSource + "; Initial Catalog=" + Configs.DatabaseCatalog + "; Integrated Security=" + Configs.IntegratedSecurityProtocol);
            connection.Open();

            char[] delim = { ' ', ',' };
            string sInsertServerSpace = "INSERT INTO ServerSpace (date_time, server, region, farm, technology, role, drive, total_space, free_space) VALUES (@dt, @ser, @reg, @farm, @tech, @role, @drive, @ts, @fs)";
            string sDeleteServerSpace = "DELETE FROM ServerSpace WHERE server=@serd AND drive=@deletedrive";

            foreach (string server in Configs.servers)
            {
                string temp;
                SqlCommand cmdInsertServerSpace = new SqlCommand(sInsertServerSpace, connection);
                SqlCommand cmdDeleteServerSapce = new SqlCommand(sDeleteServerSpace, connection);
                Configs.GetServerAttributes(server);
                if (Configs.technology != "SQL")
                {
                    GetSpace.DriveSpaceByServer(server);
                }
                else
                {
                    GetSpace.DriveSpaceByServerMount(server);
                }
                string[] driveStats = GetSpace.ServerSpaceStats.Split(delim);

                temp = DateTime.Now.ToString();
                cmdInsertServerSpace.Parameters.AddWithValue("@dt", temp);

                temp = server.ToString();
                cmdDeleteServerSapce.Parameters.AddWithValue("@serd", temp);
                cmdInsertServerSpace.Parameters.AddWithValue("@ser", temp);

                temp = Configs.regiongroup.ToString();
                cmdInsertServerSpace.Parameters.AddWithValue("@reg", temp);

                temp = Configs.farmgroup.ToString();
                cmdInsertServerSpace.Parameters.AddWithValue("@farm", temp);

                temp = Configs.technology.ToString();
                cmdInsertServerSpace.Parameters.AddWithValue("@tech", temp);

                temp = Configs.rolegroup.ToString();
                cmdInsertServerSpace.Parameters.AddWithValue("@role", temp);

                for (int i = 0; i < driveStats.Length; i++)
                {
                temp = driveStats[i].ToString();
                cmdInsertServerSpace.Parameters.AddWithValue("@drive", temp);
                cmdDeleteServerSapce.Parameters.AddWithValue("@deletedrive", temp);
                i++;

                temp = driveStats[i].ToString();
                cmdInsertServerSpace.Parameters.AddWithValue("@ts", temp);
                    i++;
                temp = driveStats[i].ToString();
                cmdInsertServerSpace.Parameters.AddWithValue("@fs", temp);
                cmdDeleteServerSapce.ExecuteNonQuery();
                cmdInsertServerSpace.ExecuteNonQuery();
                }
                //RecordServerSpace.WriteLine(DateTime.Now + "," + server + "," + Configs.regiongroup + "," + Configs.farmgroup + "," + Configs.technology + "," + Configs.rolegroup + "," + GetSpace.ServerSpaceStats);
            }
            connection.Close();

他に参照する必要がある場合はお知らせください。

4

4 に答える 4

6

パラメータを追加する必要があるのは 1 回だけです。ループのたびにパラメーターを追加しています。パラメータを 1 回追加するように変更しますが、ループを実行するたびに値を設定します。

SqlCommand cmdDeleteServerSapce = new SqlCommand(sDeleteServerSpace, connection);  
....  
cmdInsertServerSpace.Parameters.AddWithValue("@drive", temp);
cmdDeleteServerSapce.Parameters.AddWithValue("@deletedrive", temp));

for (int i = 0; i < driveStats.Length; i++)     
{        
    temp = driveStats[i].ToString();        
    cmdInsertServerSpace.Parameters["@drive"].value = temp;
    cmdDeleteServerSapce.Parameters["@deletedrive"].value = temp;

    .....

    cmdDeleteServerSapce.ExecuteNonQuery();
    cmdInsertServerSpace.ExecuteNonQuery(); 
} 
于 2012-06-05T20:54:03.437 に答える
2

ループ内でコマンドを使用しているようです。パラメータを 1 回入力するだけです (AddWithValue)。その後の試行で変更できますが、再度追加しないでください。

やったほうがいい:

cmdDeleteServerSapce.Parameters.Add("@deletedrive", SqlDbType.VarChar); 

ループの外。

cmdDeleteServerSapce.Parameters["@deletedrive"].Value = temp; 

ループの内側。

于 2012-06-05T20:52:36.077 に答える
0

I believe you are missing a call to cmdInsertServerSpace.ExecuteNonQuery() and cmdDeleteServerSapce.ExecuteNonQuery() within your loop. I would recommend the following:

cmdInsertServerSpace.Parameters.Add("@drive", SqlDbType.VarChar);
cmdDeleteServerSapce.Parameters.Add("@deletedrive", SqlDbType.VarChar);
for (int i = 0; i < driveStats.Length; i++) {
    string temp = driveStats[i].ToString();
    cmdInsertServerSpace.Parameters["@drive"].Value = temp;
    cmdDeleteServerSapce.Parameters["@deletedrive"].Value = temp;
    i++;
  .....
    cmdInsertServerSpace.ExecuteNonQuery();
    cmdDeleteServerSapce.ExecuteNonQuery();
}
于 2012-06-05T21:00:01.557 に答える
0

パラメータ clear を使用する必要があります

            **cmdInsertServerSpace.Parameters.Clear();**
            cmdInsertServerSpace.Parameters.AddWithValue("@dt", temp);

            temp = server.ToString();
            cmdDeleteServerSapce.Parameters.AddWithValue("@serd", temp);
            cmdInsertServerSpace.Parameters.AddWithValue("@ser", temp);
于 2012-11-23T23:29:18.693 に答える