Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну в общем прошло уже несколько больше года. Да и ладно уж "крупные". Хотя бы один пример коммерческого проекта под дотнет "широкого" масштаба.
Тот же АВК работает в одной из довольно известных Московских контор и делают они сейчас пилотный проект на дотнете. Естественно, что сервеная сторона там преобладает, но и десктоп вроде тоже на дотнете пишут.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
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:
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 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ExtraLamer, Вы писали:
EL>>спасибо за ответ. Такая форма записи массива хоть и более понятна, но менее гибка,
VD>Чем же это?
Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.
EL>> инициализировать всё же лучше будет в конструкторе
VD>И в чем проблема? Я же тебе сказал, что реально инициализация идет в рантайме. Ты можешь с тем же успхам перенести эту инициализацию в конструктор и даже использовать переменные в для задания размеров массивов.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Воронков Василий, Вы писали:
ВВ>>ЗЫ. А что значит можно под новый офис макросы на дотнете писать? Т.е. компилируемые макросы? Где об этом можно прочитать?
VD>VSA называется. Почитать естественно в МСДН на МС. А вообще на них и посмотреть можно. В студии именно они, только версией помладше.
Здравствуйте, ExtraLamer, Вы писали:
EL>Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.
Несовсем. Это и быстрее и удобнее. Быстрее потому, что компилятор может оптимизировать инициализацию, а проще хотя бы потому, что труднее запутаться в невероятном количестве присвоений.
EL>А я что не вконструкторе там инициализировал?
Я имел в виду, что можно перенести инициализацию (именно декларативную) в конструктор и ничего не изменится.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ExtraLamer, Вы писали:
EL>>Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.
VD>Несовсем. Это и быстрее и удобнее. Быстрее потому, что компилятор может оптимизировать инициализацию, а проще хотя бы потому, что труднее запутаться в невероятном количестве присвоений.
Про быстрее — не знаю. Миллисикунды — считать наверно смысла нет. Если уж совсем будет медленно — можно повесить пользователю splash — "Loading ... please wait" .
Что же до удобства — то я думаю вы согласитесь — что это сугубо "дело вкуса".
EL>>А я что не вконструкторе там инициализировал?
VD>Я имел в виду, что можно перенести инициализацию (именно декларативную) в конструктор и ничего не изменится.
Ну я и говори — что не чего не изменится. На деле — одно и то же.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>>>Ну хоум-то все-таки проект "в пределах сообщества". AVK>>А что это меняет?
ВВ>Просто его видно только внутри РСДН, а за пределами — ни зги.
Что это меняет?
ВВ>По большому счету вся пурга по поводу того, что дотнет отстой и происходит из-за того, что не показал он себя пока как успешное средство на десктопе.
И не покажет так быстро, средства разработки за год не меняются. Сколько времени прошло с выхода первых виндов, прежде чем под нее стали появляться серьезные пакеты?
ВВ>Ну в общем прошло уже несколько больше года.
Это слишком мало. Год нужно только чтобы рискнуть начать что то крупное на нем разрабатывать.
ВВ>Да и ладно уж "крупные". Хотя бы один пример коммерческого проекта под дотнет "широкого" масштаба.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Hello, Воронков! AS>You wrote on Tue, 26 Aug 2003 14:17:33 GMT:
AS>хъ AS>Примечателен и не более того. AS>Я всегда выставляю on на уровне проекта и проблем не знаю.
О чем речь-то вначале шла? О том, что де отличия между вб.нет и диезом — совершенно условны. Я это привел в качестве доказательства обратного, так как на мой взгляд эта фичка довольно важная и считать ее условным отличием нельзя. А можно ведь еще и вспомнить об option explicit, который включен по умолчанию. То есть я собсно не утверждаю, что так нужно писать и что это хорошо.
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.
Все!
Писать на плюсах просто надо уметь.
Hello, AndrewVK!
You wrote on Tue, 26 Aug 2003 15:10:39 GMT:
хъ
A> А тут и проверять нечего, все что ты описал не имеет отношения к самому A> коду. Так что либо ты лукавишь и чего то недоговариваешь, либо от A> дотнета тут ничего не зависит.
А ты посмотри код (запостил в ответ Владу).
хъ
A> Понятия не имею, я твой код не видел. Опиши задачку подробнее, сделаю A> тебе программку которая зависать и останавливаться не будет.
Здравствуйте, Alexey Shirshov, Вы писали:
V>> Я проверял. Не твой код конечно, но все же. При общении с БД скорость V>> кода уже не так важна.
AS>Я бы не стал так говорить.
А зря. Скорость обращения к БД на несколько порядков ниже скорости работы кода. На твоей задачке даже между ассемблером и JScript разницы не будет.
V>> Так может, у тебя что-то с алгоритмом было нета? Или ты где-то память V>> удерживал?
AS>А как можно память удерживать?
Оставлять ссылки
AS>Ок. Вот код. Только он очень старый (еще зимой писанный), так что прошу AS>особо к стилю не привязываться.
[skip]
Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой соединения закрывать будет? Бедный MSSQL, это ж ему несколько тысяч соединений одновременно пришлось держать. Как еще у тебя вобще что то работало. V>> Правильно пиши на плюсах. А то что за работа конторы без периодических AS>AV
AS>AV ловят криворукие программеры и новички. AS>У меня, последние AV, с которыми я трахался, были связаны с багами в ATL. AS>Все! AS>Писать на плюсах просто надо уметь.
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> Как еще у тебя вобще что то работало.
Ты свой код сначала покажи, прежде чем мой работающий хаять.
Здравствуйте, Alexey Shirshov, Вы писали:
A>> не будет.
AS>На VBS не проверял, но думаю, что это по быстрее получится.
Ну по сравнению с твоим кодом конечно быстрее.
A>> Оставлять ссылки
AS>Это как?
А вот так. Добавил какой нибудь объект в глобальную коллекцию и забыл его оттуда выкинуть по ненадобности. Или подписался на событие, а по пропаданию надобности забыл отписаться.
A>> Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой A>> соединения закрывать будет?
AS>Во-первых, почему во множественном числе?
Где множественное число?
A>> Как еще у тебя вобще что то работало.
AS>Ты свой код сначала покажи, прежде чем мой работающий хаять.
Ну хорошо. Несколько комментариев
1) Во первых смысл параметра @sd мне понять не удалось, поскольку он всегда пустая строка. Я его просто выкинул.
2) О содержимом хранимок остается только догадываться, поэтому я выкинул возврат в результате ошибок. Мои хранимки такие:
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 часов я не в состоянии. Так что, как видишь, виноват не дотнет.
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 procedureWith 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 nextIf 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 DBFor 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 resultIf 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 файл в секунду. Что очень не плохо.
Неужели все дело было в дополнительных объектаз-параметрах, которые не
убивались?
Здравствуйте, 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 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, 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 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.