Re[21]: Массивы в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.08.03 19:38
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну в общем прошло уже несколько больше года. Да и ладно уж "крупные". Хотя бы один пример коммерческого проекта под дотнет "широкого" масштаба.


Тот же АВК работает в одной из довольно известных Московских контор и делают они сейчас пилотный проект на дотнете. Естественно, что сервеная сторона там преобладает, но и десктоп вроде тоже на дотнете пишут.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Массивы в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.08.03 19:38
Оценка:
Здравствуйте, gbush, Вы писали:

G>

G>Note that jagged arrays are not compliant with the common language specification (CLS). This means you should not expose jagged arrays from any class you want CLS-compliant code to consume. For more information, see Arrays.


G>from МСДН


Здорово. А вот описание массивов из стандарта Шарпа принятого екмой как часть стандарта дотнета:

19.1 Array types
An array type is written as a non-array-type followed by one or more rank-specifiers:

array-type:
  non-array-type   rank-specifiers
non-array-type:
  type
rank-specifiers:
  rank-specifier
  rank-specifiers   rank-specifier
rank-specifier:
  [   dim-separatorsopt   ]
dim-separators:
  ,
  dim-separators   ,

A non-array-type is any type that is not itself an array-type.
The rank of an array type is given by the leftmost rank-specifier in the array-type: A rank-specifier indicates that the array is an array with a rank of one plus the number of "," tokens in the rank-specifier.
The element type of an array type is the type that results from deleting the leftmost rank-specifier:
" An array type of the form T[R] is an array with rank R and a non-array element type T.
" An array type of the form T[R][R1]…[RN] is an array with rank R and an element type T[R1]…[RN].
In effect, the rank-specifiers are read from left to right before the final non-array element type. [Example: The type int[][,,][,] is a single-dimensional array of three-dimensional arrays of two-dimensional arrays of int. end example]
At run-time, a value of an array type can be null or a reference to an instance of that array type.


Ведь получается, что тогда часть спецификации не совместима с ней же.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Массивы в C#
От: ExtraLamer  
Дата: 26.08.03 19:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, ExtraLamer, Вы писали:


EL>>спасибо за ответ. Такая форма записи массива хоть и более понятна, но менее гибка,


VD>Чем же это?


Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.

EL>> инициализировать всё же лучше будет в конструкторе


VD>И в чем проблема? Я же тебе сказал, что реально инициализация идет в рантайме. Ты можешь с тем же успхам перенести эту инициализацию в конструктор и даже использовать переменные в для задания размеров массивов.


А я что не вконструкторе там инициализировал?
Re[22]: Массивы в C#
От: Воронков Василий Россия  
Дата: 26.08.03 20:00
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Воронков Василий, Вы писали:


ВВ>>ЗЫ. А что значит можно под новый офис макросы на дотнете писать? Т.е. компилируемые макросы? Где об этом можно прочитать?


VD>VSA называется. Почитать естественно в МСДН на МС. А вообще на них и посмотреть можно. В студии именно они, только версией помладше.


Понятно. Я несколько неправильно понял.
... << RSDN@Home 1.1 beta 1 >>
Re[13]: Массивы в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.08.03 20:04
Оценка:
Здравствуйте, ExtraLamer, Вы писали:

EL>Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.


Несовсем. Это и быстрее и удобнее. Быстрее потому, что компилятор может оптимизировать инициализацию, а проще хотя бы потому, что труднее запутаться в невероятном количестве присвоений.

EL>А я что не вконструкторе там инициализировал?


Я имел в виду, что можно перенести инициализацию (именно декларативную) в конструктор и ничего не изменится.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Массивы в C#
От: ExtraLamer  
Дата: 26.08.03 21:07
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, ExtraLamer, Вы писали:


EL>>Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.


VD>Несовсем. Это и быстрее и удобнее. Быстрее потому, что компилятор может оптимизировать инициализацию, а проще хотя бы потому, что труднее запутаться в невероятном количестве присвоений.


Про быстрее — не знаю. Миллисикунды — считать наверно смысла нет. Если уж совсем будет медленно — можно повесить пользователю splash — "Loading ... please wait" .
Что же до удобства — то я думаю вы согласитесь — что это сугубо "дело вкуса".

EL>>А я что не вконструкторе там инициализировал?


VD>Я имел в виду, что можно перенести инициализацию (именно декларативную) в конструктор и ничего не изменится.


Ну я и говори — что не чего не изменится. На деле — одно и то же.
Re[21]: Массивы в C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 27.08.03 06:00
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>>>Ну хоум-то все-таки проект "в пределах сообщества".

AVK>>А что это меняет?

ВВ>Просто его видно только внутри РСДН, а за пределами — ни зги.


Что это меняет?

ВВ>По большому счету вся пурга по поводу того, что дотнет отстой и происходит из-за того, что не показал он себя пока как успешное средство на десктопе.


И не покажет так быстро, средства разработки за год не меняются. Сколько времени прошло с выхода первых виндов, прежде чем под нее стали появляться серьезные пакеты?

ВВ>Ну в общем прошло уже несколько больше года.


Это слишком мало. Год нужно только чтобы рискнуть начать что то крупное на нем разрабатывать.

ВВ>Да и ладно уж "крупные". Хотя бы один пример коммерческого проекта под дотнет "широкого" масштаба.


Библиотеки компонент вроде инфраджистика это крупный проект? А вобще
http://www.microsoft.com/net/casestudies/
... << RSDN@Home 1.1 beta 1 >>
AVK Blog
Re[20]: Массивы в C#
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 27.08.03 06:28
Оценка:
Hello, Воронков!
You wrote on Tue, 26 Aug 2003 14:17:33 GMT:

хъ
Примечателен и не более того.
Я всегда выставляю on на уровне проекта и проблем не знаю.

With best regards, Alex Shirshov.
Posted via RSDN NNTP Server 1.7 beta
Re[21]: Массивы в C#
От: Воронков Василий Россия  
Дата: 27.08.03 07:13
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Hello, Воронков!

AS>You wrote on Tue, 26 Aug 2003 14:17:33 GMT:

AS>хъ

AS>Примечателен и не более того.
AS>Я всегда выставляю on на уровне проекта и проблем не знаю.

О чем речь-то вначале шла? О том, что де отличия между вб.нет и диезом — совершенно условны. Я это привел в качестве доказательства обратного, так как на мой взгляд эта фичка довольно важная и считать ее условным отличием нельзя. А можно ведь еще и вспомнить об option explicit, который включен по умолчанию. То есть я собсно не утверждаю, что так нужно писать и что это хорошо.
... << RSDN@Home 1.1 beta 1 >>
Re[22]: Массивы в C#
От: Воронков Василий Россия  
Дата: 27.08.03 07:15
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Ну в общем все ты правильно говоришь, конечно. Я собсно лишь о том, что если б офис 2003 имел бы приставку .НЕТ, то скептиков бы заметно поубавилось.
... << RSDN@Home 1.1 beta 1 >>
Re[21]: Массивы в C#
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.08.03 04:19
Оценка:
Hello, VladD2!
You wrote on Tue, 26 Aug 2003 15:59:39 GMT:

[]

V> Я проверял. Не твой код конечно, но все же. При общении с БД скорость

V> кода уже не так важна.

Я бы не стал так говорить.

V> Именно по этому неблыо никаких проблем в создании клиентов для БД на ВБ.

V> А ведь ВБ6 был дико тормозным. Дотнету до него ой как долеко (это тоже
V> проверял).

Про vb6 никто ничего не говорил.

хъ

V> Так может, у тебя что-то с алгоритмом было нета? Или ты где-то память

V> удерживал?

А как можно память удерживать?

хъ

AS>> З.Ы. Я думаю, что проблемы была в рекурсивном вызове процедуры закачки

AS>> для каталогов. Видимо, используемые ресурсы из-за этого не
AS>> освобождались.

V> Дык, а зачем же ты их держал? Вызывай из этой рекурсивной процедуры

V> другоую рабочую и делай в ней все что тебе нужно. Память будет
V> освобждаться автоматически. А так... Если ты на С++ начнешь в
V> рекусрсивной процедуре память пачками занимть, то она тоже будет
V> торомозить.

Ничего тормозить не будет. К тому же, память програмулиной вообще,
практически, не жралась.

хъ

V> Ну, ты ее код нам покажи, а мы глянем, что не так...


Ок. Вот код. Только он очень старый (еще зимой писанный), так что прошу
особо к стилю не привязываться.

    Class CApp
        Public path As String
        Public recursive As Boolean

        Private tabs As String
        Private conn As New SqlConnection("Data Source=machine;User
id=user;password=password")

        Sub New(ByVal path As String, ByVal r As Boolean)
            If Directory.Exists(path) Then
                MyClass.path = path
                recursive = r
                conn.Open()
            Else
                Throw New DirectoryNotFoundException()
            End If
        End Sub

        Public Sub Process()
            Process(path)
        End Sub

        Private Sub Process(ByVal path As String)
            Dim cmd As New SqlCommand()
            Dim b As Boolean
            Dim oldtabs As String
            With cmd
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                With .Parameters(0)
                    .ParameterName = "@return_value"
                    .SqlDbType = SqlDbType.Int
                    .Direction = ParameterDirection.ReturnValue
                End With
                With .Parameters(1)
                    .ParameterName = "@name"
                    .SqlDbType = SqlDbType.NVarChar
                    .Size = 1000
                    .Direction = ParameterDirection.Input
                End With
                With .Parameters(2)
                    .ParameterName = "@sd"
                    .SqlDbType = SqlDbType.Text
                    .Direction = ParameterDirection.Input
                End With
                With .Parameters(3)
                    .ParameterName = "@parent"
                    .SqlDbType = SqlDbType.Int
                    .Direction = ParameterDirection.Input
                End With
                .Parameters(1).Value = path
                .Parameters(2).Value = ""
                .Parameters(3).Value = 0
                .CommandText = "CreateFolder"
                .CommandType = CommandType.StoredProcedure
                .Connection = conn
                Try
                    .ExecuteNonQuery()
                Catch e As SqlException
                    b = True
                    Console.WriteLine(tabs & path & vbTab & " - error
message: " & e.Message)
                End Try
            End With
            If Not b Then
                Dim s As String
                Dim retval As Integer =
Convert.ToInt32(cmd.Parameters(0).Value)
                If retval > 0 Then
                    s = tabs & path & vbTab & " - inserts under " &
retval.ToString()
                Else
                    s = tabs & path & vbTab & " - error code " &
retval.ToString()
                End If
                Console.WriteLine(s)
                If retval > 0 Then
                    Dim di As New DirectoryInfo(path)
                    Dim fi As FileInfo
                    Dim dir As DirectoryInfo
                    UpdateFileInfo(di, retval)
                    tabs += "  "
                    Dim FolderId As Integer = retval
                    cmd.Parameters.Add(cmd.CreateParameter())

                    For Each fi In di.GetFiles()
                        cmd.Parameters(1).Value = fi.FullName
                        cmd.Parameters(2).Value = ""
                        cmd.Parameters(3).Value = FolderId
                        With cmd.Parameters(4)
                            .SqlDbType = SqlDbType.Int
                            .Direction = ParameterDirection.Input
                            .ParameterName = "@aid"
                            .Value = UpdateFileAttributes(fi.Attributes,
fi.Name)
                        End With
                        cmd.CommandText = "CreateFile"
                        Try
                            cmd.ExecuteNonQuery()
                        Catch e As SqlException
                            b = True
                            Console.WriteLine(tabs & fi.Name & vbTab & " -
error message: " & e.Message)
                        End Try
                        If Not b Then
                            retval =
Convert.ToInt32(cmd.Parameters(0).Value)
                            If retval > 0 Then
                                s = tabs & fi.Name & vbTab & " - inserts
under " & retval.ToString()
                            Else
                                s = tabs & fi.Name & vbTab & " - error code
" & retval.ToString()
                            End If
                            Console.WriteLine(s)
                            If retval > 0 Then
                                Dim cmd1 As New SqlCommand()
                                UpdateFileInfo(fi, retval)
                                With cmd1
                                    .Parameters.Add(.CreateParameter())
                                    .Parameters.Add(.CreateParameter())
                                    With .Parameters(0)
                                        .SqlDbType = SqlDbType.BigInt
                                        .Direction =
ParameterDirection.Input
                                        .ParameterName = "@fs"
                                        .Value = fi.Length
                                    End With
                                    With .Parameters(1)
                                        .SqlDbType = SqlDbType.Int
                                        .Direction =
ParameterDirection.Input
                                        .ParameterName = "@id"
                                        .Value = retval
                                    End With
                                    .CommandText = "update RealFile set
FileSize=" & _
                                        "@fs where id = @id"
                                    .Connection = conn
                                    .CommandType = CommandType.Text
                                    Try
                                        .ExecuteNonQuery()
                                    Catch e As SqlException
                                        Console.WriteLine(tabs & fi.Name &
vbTab & " - error message: " & e.Message)
                                    End Try
                                End With
                            End If
                        End If
                    Next
                    For Each dir In di.GetDirectories()
                        oldtabs = tabs
                        Process(dir.FullName) ' вот он! - рекурсивный вызов
                        tabs = oldtabs
                    Next
                End If
            End If
        End Sub

        Private Sub UpdateFileInfo(ByVal fsi As FileSystemInfo, ByVal id As
Integer)
            Dim cmd As New SqlCommand()
            With cmd
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                With .Parameters(0)
                    .SqlDbType = SqlDbType.DateTime
                    .Direction = ParameterDirection.Input
                    .ParameterName = "@c"
                    .Value = fsi.CreationTime
                End With
                With .Parameters(1)
                    .SqlDbType = SqlDbType.DateTime
                    .Direction = ParameterDirection.Input
                    .ParameterName = "@a"
                    .Value = fsi.LastAccessTime
                End With
                With .Parameters(2)
                    .SqlDbType = SqlDbType.DateTime
                    .Direction = ParameterDirection.Input
                    .ParameterName = "@w"
                    .Value = fsi.LastWriteTime
                End With
                With .Parameters(3)
                    .SqlDbType = SqlDbType.Int
                    .Direction = ParameterDirection.Input
                    .ParameterName = "@id"
                    .Value = id
                End With
                .CommandText = "update FileBase set " & _
                    "CreationTime = @c," & _
                    "LastAccessTime = @a," & _
                    "LastWriteTime = @w where id = @id"
                .CommandType = CommandType.Text
                .Connection = conn
                Try
                    .ExecuteNonQuery()
                Catch e As SqlException
                    Console.WriteLine(tabs & fsi.Name & vbTab & " - error
message: " & e.Message)
                End Try
            End With
        End Sub

        Private Function UpdateFileAttributes(ByVal fa As FileAttributes,
ByVal fname As String) As Integer
            Dim cmd As New SqlCommand()
            With cmd
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                .Parameters.Add(.CreateParameter())
                With .Parameters(0)
                    .SqlDbType = SqlDbType.Bit
                    .ParameterName = "@a"
                    .Direction = ParameterDirection.Input
                    .Value = (fa = fa.Archive)
                End With
                With .Parameters(1)
                    .SqlDbType = SqlDbType.Bit
                    .ParameterName = "@c"
                    .Direction = ParameterDirection.Input
                    .Value = (fa = fa.Compressed)
                End With
                With .Parameters(2)
                    .SqlDbType = SqlDbType.Bit
                    .ParameterName = "@e"
                    .Direction = ParameterDirection.Input
                    .Value = (fa = fa.Encrypted)
                End With
                With .Parameters(3)
                    .SqlDbType = SqlDbType.Bit
                    .ParameterName = "@h"
                    .Direction = ParameterDirection.Input
                    .Value = (fa = fa.Hidden)
                End With
                With .Parameters(4)
                    .SqlDbType = SqlDbType.Bit
                    .ParameterName = "@n"
                    .Direction = ParameterDirection.Input
                    .Value = (fa = fa.Normal)
                End With
                With .Parameters(5)
                    .SqlDbType = SqlDbType.Bit
                    .ParameterName = "@r"
                    .Direction = ParameterDirection.Input
                    .Value = (fa = fa.ReadOnly)
                End With
                With .Parameters(6)
                    .SqlDbType = SqlDbType.Bit
                    .ParameterName = "@s"
                    .Direction = ParameterDirection.Input
                    .Value = (fa = fa.System)
                End With
                With .Parameters(7)
                    .SqlDbType = SqlDbType.Int
                    .ParameterName = "@id"
                    .Direction = ParameterDirection.Output
                End With
                .CommandText = "AddAttr"
                .CommandType = CommandType.StoredProcedure
                .Connection = conn
                Try
                    .ExecuteNonQuery()
                Catch e As SqlException
                    Console.WriteLine(tabs & fname & vbTab & " - error
message: " & e.Message)
                End Try
            End With
            Return Convert.ToInt32(cmd.Parameters("@id").Value)
        End Function
    End Class


AS>> З.Ы.Ы. OLTP сервера я на нем точно писать не буду.


V> Правильно пиши на плюсах. А то что за работа конторы без периодических

AV

AV ловят криворукие программеры и новички.
У меня, последние AV, с которыми я трахался, были связаны с багами в ATL.
Все!
Писать на плюсах просто надо уметь.

With best regards, Alex Shirshov.
Posted via RSDN NNTP Server 1.7 beta
Re[21]: Массивы в C#
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.08.03 04:20
Оценка:
Hello, AndrewVK!
You wrote on Tue, 26 Aug 2003 15:10:39 GMT:

хъ

A> А тут и проверять нечего, все что ты описал не имеет отношения к самому

A> коду. Так что либо ты лукавишь и чего то недоговариваешь, либо от
A> дотнета тут ничего не зависит.

А ты посмотри код (запостил в ответ Владу).

хъ

A> Понятия не имею, я твой код не видел. Опиши задачку подробнее, сделаю

A> тебе программку которая зависать и останавливаться не будет.

Оптимистично!

хъ

With best regards, Alex Shirshov.
Posted via RSDN NNTP Server 1.7 beta
Re[22]: Массивы в C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.08.03 06:00
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

V>> Я проверял. Не твой код конечно, но все же. При общении с БД скорость

V>> кода уже не так важна.

AS>Я бы не стал так говорить.


А зря. Скорость обращения к БД на несколько порядков ниже скорости работы кода. На твоей задачке даже между ассемблером и JScript разницы не будет.

V>> Так может, у тебя что-то с алгоритмом было нета? Или ты где-то память

V>> удерживал?

AS>А как можно память удерживать?


Оставлять ссылки

AS>Ок. Вот код. Только он очень старый (еще зимой писанный), так что прошу

AS>особо к стилю не привязываться.

[skip]

Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой соединения закрывать будет? Бедный MSSQL, это ж ему несколько тысяч соединений одновременно пришлось держать. Как еще у тебя вобще что то работало.
V>> Правильно пиши на плюсах. А то что за работа конторы без периодических
AS>AV

AS>AV ловят криворукие программеры и новички.

AS>У меня, последние AV, с которыми я трахался, были связаны с багами в ATL.
AS>Все!
AS>Писать на плюсах просто надо уметь.

На дотнете тоже.
... << RSDN@Home 1.1 beta 1 >>
AVK Blog
Re[23]: Массивы в C#
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.08.03 06:27
Оценка:
Hello, AndrewVK!
You wrote on Thu, 28 Aug 2003 06:00:33 GMT:

хъ

A> А зря. Скорость обращения к БД на несколько порядков ниже скорости

A> работы кода. На твоей задачке даже между ассемблером и JScript разницы
A> не будет.

На VBS не проверял, но думаю, что это по быстрее получится.

хъ

A> Оставлять ссылки


Это как?

хъ

A> Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой

A> соединения закрывать будет?

Во-первых, почему во множественном числе?
Во-вторых, зачем его закрывать? Программа завершится, оно и закроется.

A> Бедный MSSQL, это ж ему несколько тысяч соединений одновременно пришлось

A> держать.

С чего ты взял?

A> Как еще у тебя вобще что то работало.


Ты свой код сначала покажи, прежде чем мой работающий хаять.

хъ

> На дотнете тоже.


Истино так!


With best regards, Alex Shirshov.
Posted via RSDN NNTP Server 1.7 beta
Re[24]: Массивы в C#
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.08.03 12:40
Оценка: 12 (2)
Здравствуйте, Alexey Shirshov, Вы писали:

A>> не будет.


AS>На VBS не проверял, но думаю, что это по быстрее получится.


Ну по сравнению с твоим кодом конечно быстрее.

A>> Оставлять ссылки


AS>Это как?


А вот так. Добавил какой нибудь объект в глобальную коллекцию и забыл его оттуда выкинуть по ненадобности. Или подписался на событие, а по пропаданию надобности забыл отписаться.

A>> Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой

A>> соединения закрывать будет?

AS>Во-первых, почему во множественном числе?


Где множественное число?

A>> Как еще у тебя вобще что то работало.


AS>Ты свой код сначала покажи, прежде чем мой работающий хаять.


Ну хорошо. Несколько комментариев
1) Во первых смысл параметра @sd мне понять не удалось, поскольку он всегда пустая строка. Я его просто выкинул.
2) О содержимом хранимок остается только догадываться, поэтому я выкинул возврат в результате ошибок. Мои хранимки такие:

CREATE PROCEDURE dbo.create_dir 
    @name nvarchar(1000), 
    @parent int, 
    @creation_time datetime, 
    @last_access_time datetime, 
    @last_write_time datetime,
    @return_value int out 
AS
INSERT INTO files(name, parent, is_dir, creation_time, last_access_time, last_write_time) 
    VALUES(@name, @parent, 1, @creation_time, @last_access_time, @last_write_time)
SELECT @return_value = @@IDENTITY


CREATE PROCEDURE dbo.create_file
    @name nvarchar(1000), 
    @parent int, 
    @creation_time datetime, 
    @last_access_time datetime, 
    @last_write_time datetime,
    @attr_archive bit,
    @attr_compressed bit,
    @attr_encrypted bit,
    @attr_hidden bit,
    @attr_readonly bit,
    @attr_system bit,
    @file_size bigint,
    @return_value int out 
AS
INSERT INTO files(name, parent, is_dir, creation_time, last_access_time, last_write_time, 
    attr_archive, attr_compressed, attr_encrypted, attr_hidden, attr_readonly, attr_system, 
    file_size) 
    VALUES(@name, @parent, 0, @creation_time, @last_access_time, @last_write_time,
    @attr_archive, @attr_compressed, @attr_encrypted, @attr_hidden, @attr_readonly, @attr_system,
    @file_size)
SELECT @return_value = @@IDENTITY


3) recursive у тебя нигде не используется, но по смыслу я догадался о чем речь и реализовал
4) Атрибута Normal не существует, это отсутствие атрибутов
5) Перечисление FileAttributes флаговое, просто сравнивать, как это делаешь ты, нельзя, результат при наличии нескольких атрибутов будет неверным.
6) Записывать в одну и ту же строку значения двумя запросами, да еще и с поиском во втором запросе, да еще и в разных транзакциях просто глупо, производительность снизится в несколько раз.

using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;

namespace DotNetTest
{
    public class App
    {
        private const string _conStr = "Integrated Security=SSPI;Initial Catalog=Test";
        private static int _totalProcessed = 0;

        public static void Main(string[] args)
        {
            string path;
            bool recursive;
            try
            {
                path = args[0];
                recursive = bool.Parse(args[1]);
            }
            catch
            {
                throw new ArgumentException("Invalid command line arguments");
            }

            DirectoryInfo dirInfo = new DirectoryInfo(path);
            if (!dirInfo.Exists)
                throw new DirectoryNotFoundException(path);

            Console.WriteLine("Processing directory '{0}' {1}", path, recursive ? "recursive" : "");

            int st = Environment.TickCount;
            ProcessDir(dirInfo, recursive, -1, "");
            st = Environment.TickCount - st;

            Console.WriteLine("Processed {0} files in {1}", _totalProcessed, TimeSpan.FromMilliseconds(st));

            Console.Read();
        }

        private static void ProcessDir(DirectoryInfo dirInfo, bool recursive, int parent, string shift)
        {
            _totalProcessed++;
            int dirId;
            string prefix = shift + dirInfo.FullName + " ";
            using (SqlConnection con = new SqlConnection(_conStr))
            using (SqlCommand cmd = new SqlCommand("create_dir", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@return_value", SqlDbType.Int).Direction = 
                    ParameterDirection.Output;
                cmd.Parameters.Add("@name", SqlDbType.NVarChar, 1000).Value = dirInfo.FullName;
                cmd.Parameters.Add("@parent", SqlDbType.Int).Value = parent;
                AddFileInfo(cmd.Parameters, dirInfo);
                con.Open();
                try
                {
                    cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(prefix + " error: " + ex.Message);
                    return;
                }
                dirId = (int)cmd.Parameters["@return_value"].Value;
                Console.WriteLine(prefix + "insert directory with id = " + dirId);
            }

            foreach (FileInfo fileInfo in dirInfo.GetFiles())
                ProcessFile(fileInfo, dirId, shift + " ");
            
            if (recursive)
                foreach (DirectoryInfo subDirInfo in dirInfo.GetDirectories())
                    ProcessDir(subDirInfo, recursive, dirId, shift + " ");
        }

        private static void ProcessFile(FileInfo fileInfo, int dirId, string shift)
        {
            _totalProcessed++;
            string prefix = shift + fileInfo.FullName + " ";
            using (SqlConnection con = new SqlConnection(_conStr))
            using (SqlCommand cmd = new SqlCommand("create_file", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@return_value", SqlDbType.Int).Direction = 
                    ParameterDirection.Output;
                cmd.Parameters.Add("@name", SqlDbType.NVarChar, 1000).Value = fileInfo.FullName;
                cmd.Parameters.Add("@parent", SqlDbType.Int).Value = dirId;
                AddFileInfo(cmd.Parameters, fileInfo);
                AddFileAttributes(cmd.Parameters, fileInfo);
                cmd.Parameters.Add("@file_size", fileInfo.Length);
                con.Open();
                try
                {
                    cmd.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(prefix + " error: " + ex.Message);
                    return;
                }
                int fileId = (int)cmd.Parameters["@return_value"].Value;
                Console.WriteLine(prefix + "insert file with id = " + fileId);
            }
        }

        private static void AddFileInfo(SqlParameterCollection prms, FileSystemInfo fsi)
        {
            prms.Add("@creation_time", fsi.CreationTime);
            prms.Add("@last_access_time", fsi.LastAccessTime);
            prms.Add("@last_write_time", fsi.LastWriteTime);
        }

        private static void AddFileAttributes(SqlParameterCollection prms, FileSystemInfo fsi)
        {
            prms.Add("@attr_archive", (fsi.Attributes & FileAttributes.Archive) > 0);
            prms.Add("@attr_compressed", (fsi.Attributes & FileAttributes.Compressed) > 0);
            prms.Add("@attr_encrypted", (fsi.Attributes & FileAttributes.Encrypted) > 0);
            prms.Add("@attr_hidden", (fsi.Attributes & FileAttributes.Hidden) > 0);
            prms.Add("@attr_readonly", (fsi.Attributes & FileAttributes.ReadOnly) > 0);
            prms.Add("@attr_system", (fsi.Attributes & FileAttributes.System) > 0);
        }
    }
}


Результат по моему program files на Cel1800 512M и Barracuda ATA 5:
Processed 45328 files in 00:02:20.8430000

Никаких замедлений и подтормаживаний не замечено. Представить себе каталог, который будет обрабатываться 5-6 часов я не в состоянии. Так что, как видишь, виноват не дотнет.

PS: Читабельность твоего кода преотвратнейшая, еле разобрался.
... << RSDN@Home 1.1 beta 1 >>
AVK Blog
Re[25]: Массивы в C#
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.08.03 14:41
Оценка:
Hello, AndrewVK!
You wrote on Thu, 28 Aug 2003 12:40:36 GMT:

[]

A>>> Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой

A>>> соединения закрывать будет?

AS>> Во-первых, почему во множественном числе?


A> Где множественное число?


хъ


A> 6) Записывать в одну и ту же строку значения двумя запросами, да еще и с

A> поиском во втором запросе, да еще и в разных транзакциях просто глупо,
A> производительность снизится в несколько раз.

Вот тут не понял.

[код поскипан]

Переписал так. Из изменений только параметры по другому создаются.
    Class CApp
        Public path As String
        Public recursive As Boolean

        Private tabs As String
        Private conn As New SqlConnection("Data Source=dcit01;User
id=fsuser;password=fsuser")

        Private files As Integer = 0

        Sub New(ByVal path As String, ByVal r As Boolean)
            If Directory.Exists(path) Then
                MyClass.path = path
                recursive = r
                conn.Open()
            Else
                Throw New DirectoryNotFoundException()
            End If
        End Sub

        Public Function Process() As Integer
            Return Process(path)
        End Function

        Private Function Process(ByVal path As String) As Integer
            Dim cmd As New SqlCommand()
            Dim b As Boolean
            Dim oldtabs As String
            'prepare to call CreateFolder stored procedure
            With cmd
                .Parameters.Add("@return_value", SqlDbType.Int).Direction =
ParameterDirection.ReturnValue
                .Parameters.Add("@name", SqlDbType.NVarChar, 1000).Value =
path
                .Parameters.Add("@sd", SqlDbType.Text).Value = ""
                .Parameters.Add("@parent", SqlDbType.Int).Value = 0
                .CommandText = "CreateFolder"
                .CommandType = CommandType.StoredProcedure
                .Connection = conn
                Try
                    'calling
                    .ExecuteNonQuery()
                    files += 1
                Catch e As SqlException
                    b = True
                    Console.WriteLine(tabs & path & vbTab & " - error
message: " & e.Message)
                End Try
            End With

            'process the result and go next
            If Not b Then
                Dim s As String
                Dim retval As Integer =
Convert.ToInt32(cmd.Parameters(0).Value)
                If retval > 0 Then
                    s = tabs & path & vbTab & " - inserts under " &
retval.ToString()
                Else
                    s = tabs & path & vbTab & " - error code " &
retval.ToString()
                End If
                'write the result to the console
                Console.WriteLine(s)

                If retval > 0 Then
                    Dim di As New DirectoryInfo(path)
                    Dim fi As FileInfo
                    Dim dir As DirectoryInfo
                    'update directory time attributes
                    UpdateFileInfo(di, retval)

                    tabs += "  "
                    Dim FolderId As Integer = retval
                    cmd.Parameters.Add("@aid", SqlDbType.Int)

                    'fill the files to DB
                    For Each fi In di.GetFiles()
                        With cmd
                            .Parameters("@name").Value = fi.FullName
                            .Parameters("@sd").Value = ""
                            .Parameters("@parent").Value = FolderId
                            .Parameters("@aid").Value = _
                                UpdateFileAttributes(fi.Attributes, fi.Name)
                            .CommandText = "CreateFile"
                            Try
                                .ExecuteNonQuery()
                                files += 1
                            Catch e As SqlException
                                b = True
                                Console.WriteLine(tabs & fi.Name & vbTab &
" - error message: " & e.Message)
                            End Try
                        End With

                        'process the result
                        If Not b Then
                            retval =
Convert.ToInt32(cmd.Parameters(0).Value)
                            If retval > 0 Then
                                s = tabs & fi.Name & vbTab & " - inserts
under " & retval.ToString()
                            Else
                                s = tabs & fi.Name & vbTab & " - error code
" & retval.ToString()
                            End If
                            Console.WriteLine(s)
                            If retval > 0 Then
                                Dim cmd1 As New SqlCommand()
                                UpdateFileInfo(fi, retval)
                                With cmd1
                                    .Parameters.Add("@fs",
SqlDbType.BigInt).Value = fi.Length
                                    .Parameters.Add("@id",
SqlDbType.Int).Value = retval
                                    .CommandText = "update RealFile set
FileSize=" & _
                                        "@fs where id = @id"
                                    .Connection = conn
                                    .CommandType = CommandType.Text
                                    Try
                                        .ExecuteNonQuery()
                                    Catch e As SqlException
                                        Console.WriteLine(tabs & fi.Name &
vbTab & " - error message: " & e.Message)
                                    End Try
                                End With
                                'cmd1.Dispose()
                            End If
                        End If
                    Next
                    'cmd.Dispose()
                    For Each dir In di.GetDirectories()
                        oldtabs = tabs
                        Process(dir.FullName)
                        tabs = oldtabs
                    Next
                End If
            End If
            'cmd.Dispose()
            Return files
        End Function

        Private Sub UpdateFileInfo(ByVal fsi As FileSystemInfo, ByVal id As
Integer)
            Dim cmd As New SqlCommand()
            With cmd
                .Parameters.Add("@c", SqlDbType.DateTime).Value =
fsi.CreationTime
                .Parameters.Add("@a", SqlDbType.DateTime).Value =
fsi.LastAccessTime
                .Parameters.Add("@w", SqlDbType.DateTime).Value =
fsi.LastWriteTime
                .Parameters.Add("@id", SqlDbType.Int).Value = id
                .CommandText = "update FileBase set " & _
                    "CreationTime = @c," & _
                    "LastAccessTime = @a," & _
                    "LastWriteTime = @w where id = @id"
                .CommandType = CommandType.Text
                .Connection = conn
                Try
                    .ExecuteNonQuery()
                Catch e As SqlException
                    Console.WriteLine(tabs & fsi.Name & vbTab & " - error
message: " & e.Message)
                End Try
            End With
            'cmd.Dispose()
        End Sub

        Private Function UpdateFileAttributes(ByVal fa As FileAttributes,
ByVal fname As String) As Integer
            Dim cmd As New SqlCommand()
            With cmd
                .Parameters.Add("@a", SqlDbType.Bit).Value = CBool(fa And
fa.Archive)
                .Parameters.Add("@c", SqlDbType.Bit).Value = CBool(fa And
fa.Compressed)
                .Parameters.Add("@e", SqlDbType.Bit).Value = CBool(fa And
fa.Encrypted)
                .Parameters.Add("@h", SqlDbType.Bit).Value = CBool(fa And
fa.Hidden)
                .Parameters.Add("@n", SqlDbType.Bit).Value = CBool(fa And
fa.Normal)
                .Parameters.Add("@r", SqlDbType.Bit).Value = CBool(fa And
fa.ReadOnly)
                .Parameters.Add("@s", SqlDbType.Bit).Value = CBool(fa And
fa.System)
                .Parameters.Add("@id", SqlDbType.Int).Direction =
ParameterDirection.Output
                .CommandText = "AddAttr"
                .CommandType = CommandType.StoredProcedure
                .Connection = conn
                Try
                    .ExecuteNonQuery()
                Catch e As SqlException
                    Console.WriteLine(tabs & fname & vbTab & " - error
message: " & e.Message)
                End Try
            End With
            UpdateFileAttributes =
Convert.ToInt32(cmd.Parameters("@id").Value)
            'cmd.Dispose()
        End Function
    End Class


Dispose специально закоментировал, так как без него быстрее. Получилось на
папке temp 51 файл в секунду. Что очень не плохо.
Неужели все дело было в дополнительных объектаз-параметрах, которые не
убивались?

With best regards, Alex Shirshov.
Posted via RSDN NNTP Server 1.7 beta
Re[26]: Массивы в C#
От: desperado_gmbh http://www.livejournal.com/users/tolstopuz
Дата: 28.08.03 15:13
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Переписал так. Из изменений только параметры по другому создаются.


А если еще и команды заготовить заранее, а в цикле только задавать значения параметров?
Re[22]: Массивы в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.08.03 18:38
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Я бы не стал так говорить.


Не говори.

А я за свои слова отвечаю.

AS>Про vb6 никто ничего не говорил.


Что про него говорить то? Это самое часто используемое средство (в прошлом) для создания морд к БД.

AS>А как можно память удерживать?


Ну, ты сам пример привел. Рекурсия с оставлением ссылок в стеке.

AS>Ничего тормозить не будет.


Еще как будет.

AS>К тому же, память програмулиной вообще,

AS>практически, не жралась.

Ну, это другой вопрос. Если дело не в памяти, то нужно искать другую ошибку.

AS>Ок. Вот код. Только он очень старый (еще зимой писанный), так что прошу

AS>особо к стилю не привязываться.

Нда. Много.

AS>AV ловят криворукие программеры и новички.


Т.е. ты никогда не ловил? Или то тоже...

AS>У меня, последние AV, с которыми я трахался, были связаны с багами в ATL.

AS>Все!

Больше небыло? Ай-йа-йа. Ну, это потому что ты свой код не запускаешь. Мы тут запустили код к твоей статье про печать в ВТЛ, и ты представляешь (?) поймали тот самый AV. Наверно мы криворукие.

AS>Писать на плюсах просто надо уметь.


Ну, учись.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: Массивы в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.08.03 18:38
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

Кстати, структуру БД приведи. Я у себя прогонию.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Массивы в C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.08.03 18:38
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>На VBS не проверял, но думаю, что это по быстрее получится.


Гы-гы.

A>> Оставлять ссылки


AS>Это как?


Ну, вот так например:
Private Sub Process(ByVal path As String)
  Dim cmd As New SqlCommand()


Правильным решением тут было бы сделать процедуру обработки отдельной. Т.е. чтобы рекурсивная процедура вызывала Process, а сама в сете держала по минимуму. Но не думаю, что SqlCommand может занять много памяти.

AS>Во-вторых, зачем его закрывать? Программа завершится, оно и закроется.


Она кстати не закроется. Если толтько ВБ не помежет (что вряд ли). Но серверу на это чихать.

AS>Ты свой код сначала покажи, прежде чем мой работающий хаять.


Да все у тебя с коннекшеном нормально. Это он к ВБ не привык.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.